From 3d7716ef0821384613f9c7122626f9162f365f53 Mon Sep 17 00:00:00 2001 From: svenhoefer Date: Sun, 7 Nov 2021 00:57:01 +0100 Subject: [PATCH] - libraspi: some manual code nicenings Signed-off-by: Thilo Graf --- libraspi/audio.cpp | 9 ++-- libraspi/audio_lib.h | 37 ++++--------- libraspi/dmx.cpp | 44 ++++++++-------- libraspi/dmx_lib.h | 11 ++-- libraspi/glfb.cpp | 26 ++++----- libraspi/glfb.h | 12 ++--- libraspi/hardware_caps.c | 2 +- libraspi/init.cpp | 37 ++++++------- libraspi/video.cpp | 2 +- libraspi/video_lib.h | 110 +++++++++------------------------------ libspark/record.cpp | 5 +- libspark/record_lib.h | 11 ++-- 12 files changed, 107 insertions(+), 199 deletions(-) diff --git a/libraspi/audio.cpp b/libraspi/audio.cpp index 110b7b7..77da6a8 100644 --- a/libraspi/audio.cpp +++ b/libraspi/audio.cpp @@ -114,12 +114,11 @@ int cAudio::StopClip() void cAudio::getAudioInfo(int &type, int &layer, int &freq, int &bitrate, int &mode) { type = 0; - layer = 0; /* not used */ + layer = 0; /* not used */ freq = 0; - bitrate = 0; /* not used, but easy to get :-) */ - mode = 0; /* default: stereo */ - hal_debug("%s t: %d l: %d f: %d b: %d m: %d\n", - __func__, type, layer, freq, bitrate, mode); + bitrate = 0; /* not used, but easy to get :-) */ + mode = 0; /* default: stereo */ + hal_debug("%s t: %d l: %d f: %d b: %d m: %d\n", __func__, type, layer, freq, bitrate, mode); }; void cAudio::SetSRS(int /*iq_enable*/, int /*nmgr_enable*/, int /*iq_mode*/, int /*iq_level*/) diff --git a/libraspi/audio_lib.h b/libraspi/audio_lib.h index cbe0278..39c1069 100644 --- a/libraspi/audio_lib.h +++ b/libraspi/audio_lib.h @@ -41,16 +41,17 @@ typedef enum class cAudio { friend class cPlayback; + private: int fd; bool Muted; int clipfd; /* for pcm playback */ - int mixer_fd; /* if we are using the OSS mixer */ + int mixer_fd; /* if we are using the OSS mixer */ int mixer_num; /* oss mixer to use, if any */ - AUDIO_FORMAT StreamType; - AUDIO_SYNC_MODE SyncMode; + AUDIO_FORMAT StreamType; + AUDIO_SYNC_MODE SyncMode; bool started; bool thread_started; @@ -67,35 +68,17 @@ class cAudio /* construct & destruct */ cAudio(void *, void *, void *); ~cAudio(void); - int64_t getPts() - { - return curr_pts; - } + int64_t getPts() { return curr_pts; } - void *GetHandle() - { - return NULL; - }; + void *GetHandle() { return NULL; }; /* shut up */ - int mute(bool remember = true) - { - return do_mute(true, remember); - }; - int unmute(bool remember = true) - { - return do_mute(false, remember); - }; + int mute(bool remember = true) { return do_mute(true, remember); }; + int unmute(bool remember = true) { return do_mute(false, remember); }; /* volume, min = 0, max = 255 */ int setVolume(unsigned int left, unsigned int right); - int getVolume(void) - { - return volume; - } - bool getMuteStatus(void) - { - return Muted; - }; + int getVolume(void) { return volume; } + bool getMuteStatus(void) { return Muted; }; /* start and stop audio */ int Start(void); diff --git a/libraspi/dmx.cpp b/libraspi/dmx.cpp index 48c86fd..8101580 100644 --- a/libraspi/dmx.cpp +++ b/libraspi/dmx.cpp @@ -45,7 +45,7 @@ extern cVideo *videoDecoder; #define dmx_err(_errfmt, _errstr, _revents) do { \ hal_info("%s " _errfmt " fd:%d, ev:0x%x %s pid:0x%04hx flt:0x%02hx\n", \ - __func__, _errstr, fd, _revents, DMX_T[dmx_type], pid, flt); \ + __func__, _errstr, fd, _revents, DMX_T[dmx_type], pid, flt); \ } while(0); cDemux *videoDemux = NULL; @@ -111,13 +111,13 @@ bool cDemux::Open(DMX_CHANNEL_TYPE pes_type, void * /*hVideoBuffer*/, int uBuffe hal_info("%s %s: %m\n", __FUNCTION__, devname[devnum]); return false; } - hal_debug("%s #%d pes_type: %s(%d), uBufferSize: %d fd: %d\n", __func__, - num, DMX_T[pes_type], pes_type, uBufferSize, fd); + hal_debug("%s #%d pes_type: %s(%d), uBufferSize: %d fd: %d\n", + __func__, num, DMX_T[pes_type], pes_type, uBufferSize, fd); if (dmx_type == DMX_VIDEO_CHANNEL) - uBufferSize = 0x100000; /* 1MB */ + uBufferSize = 0x100000; /* 1MB */ if (dmx_type == DMX_AUDIO_CHANNEL) - uBufferSize = 0x10000; /* 64k */ + uBufferSize = 0x10000; /* 64k */ #if 0 if (!pesfds.empty()) { @@ -192,7 +192,7 @@ int cDemux::Read(unsigned char *buff, int len, int timeout) #if 0 if (len != 4095 && timeout != 100) fprintf(stderr, "cDemux::%s #%d fd: %d type: %s len: %d timeout: %d\n", - __FUNCTION__, num, fd, DMX_T[dmx_type], len, timeout); + __FUNCTION__, num, fd, DMX_T[dmx_type], len, timeout); #endif int rc; struct pollfd ufds; @@ -244,8 +244,8 @@ retry: } bool cDemux::sectionFilter(unsigned short _pid, const unsigned char *const filter, - const unsigned char *const mask, int len, int timeout, - const unsigned char *const negmask) + const unsigned char *const mask, int len, int timeout, + const unsigned char *const negmask) { struct dmx_sct_filter_params s_flt; memset(&s_flt, 0, sizeof(s_flt)); @@ -260,7 +260,7 @@ bool cDemux::sectionFilter(unsigned short _pid, const unsigned char *const filte s_flt.pid = pid; s_flt.timeout = timeout; memcpy(s_flt.filter.filter, filter, len); - memcpy(s_flt.filter.mask, mask, len); + memcpy(s_flt.filter.mask, mask, len); if (negmask != NULL) memcpy(s_flt.filter.mode, negmask, len); @@ -310,7 +310,7 @@ bool cDemux::sectionFilter(unsigned short _pid, const unsigned char *const filte /* 0x60 - 0x6F: event_information_section - other_transport_stream, schedule */ case 0x70: /* time_date_section */ s_flt.flags &= ~DMX_CHECK_CRC; /* section has no CRC */ - //s_flt.pid = 0x0014; + //s_flt.pid = 0x0014; to = 30000; break; case 0x71: /* running_status_section */ @@ -322,7 +322,7 @@ bool cDemux::sectionFilter(unsigned short _pid, const unsigned char *const filte to = 0; break; case 0x73: /* time_offset_section */ - //s_flt.pid = 0x0014; + //s_flt.pid = 0x0014; to = 30000; break; /* 0x74 - 0x7D: reserved for future use */ @@ -346,8 +346,8 @@ bool cDemux::sectionFilter(unsigned short _pid, const unsigned char *const filte if (timeout == 0 && negmask == NULL) s_flt.timeout = to; - hal_debug("%s #%d pid:0x%04hx fd:%d type:%s len:%d to:%d flags:%x flt[0]:%02x\n", __func__, num, - pid, fd, DMX_T[dmx_type], len, s_flt.timeout, s_flt.flags, s_flt.filter.filter[0]); + hal_debug("%s #%d pid:0x%04hx fd:%d type:%s len:%d to:%d flags:%x flt[0]:%02x\n", + __func__, num, pid, fd, DMX_T[dmx_type], len, s_flt.timeout, s_flt.flags, s_flt.filter.filter[0]); if (debuglevel == 2) { @@ -355,10 +355,10 @@ bool cDemux::sectionFilter(unsigned short _pid, const unsigned char *const filte for (int i = 0; i < DMX_FILTER_SIZE; i++)fprintf(stderr, "%02hhx ", s_flt.filter.filter[i]); fprintf(stderr, "\n"); fprintf(stderr, "mask: "); - for (int i = 0; i < DMX_FILTER_SIZE; i++)fprintf(stderr, "%02hhx ", s_flt.filter.mask [i]); + for (int i = 0; i < DMX_FILTER_SIZE; i++)fprintf(stderr, "%02hhx ", s_flt.filter.mask[i]); fprintf(stderr, "\n"); fprintf(stderr, "mode: "); - for (int i = 0; i < DMX_FILTER_SIZE; i++)fprintf(stderr, "%02hhx ", s_flt.filter.mode [i]); + for (int i = 0; i < DMX_FILTER_SIZE; i++)fprintf(stderr, "%02hhx ", s_flt.filter.mode[i]); fprintf(stderr, "\n"); } @@ -378,7 +378,7 @@ bool cDemux::pesFilter(const unsigned short _pid) * this check originally is from tuxbox cvs but I'm not sure * what it is good for... if (pid <= 0x0001 && dmx_type != DMX_PCR_ONLY_CHANNEL) - return false; + return false; */ if ((pid >= 0x0002 && pid <= 0x000f) || pid >= 0x1fff) return false; @@ -388,30 +388,30 @@ bool cDemux::pesFilter(const unsigned short _pid) memset(&p_flt, 0, sizeof(p_flt)); p_flt.pid = pid; p_flt.output = DMX_OUT_DECODER; - p_flt.input = DMX_IN_FRONTEND; + p_flt.input = DMX_IN_FRONTEND; switch (dmx_type) { case DMX_PCR_ONLY_CHANNEL: p_flt.pes_type = DMX_PES_OTHER; - p_flt.output = DMX_OUT_TAP; + p_flt.output = DMX_OUT_TAP; return true; break; case DMX_AUDIO_CHANNEL: p_flt.pes_type = DMX_PES_OTHER; - p_flt.output = DMX_OUT_TSDEMUX_TAP; + p_flt.output = DMX_OUT_TSDEMUX_TAP; break; case DMX_VIDEO_CHANNEL: p_flt.pes_type = DMX_PES_OTHER; - p_flt.output = DMX_OUT_TSDEMUX_TAP; + p_flt.output = DMX_OUT_TSDEMUX_TAP; break; case DMX_PES_CHANNEL: p_flt.pes_type = DMX_PES_OTHER; - p_flt.output = DMX_OUT_TAP; + p_flt.output = DMX_OUT_TAP; break; case DMX_TP_CHANNEL: p_flt.pes_type = DMX_PES_OTHER; - p_flt.output = DMX_OUT_TSDEMUX_TAP; + p_flt.output = DMX_OUT_TSDEMUX_TAP; break; default: hal_info("%s #%d invalid dmx_type %d!\n", __func__, num, dmx_type); diff --git a/libraspi/dmx_lib.h b/libraspi/dmx_lib.h index ba31736..77d5040 100644 --- a/libraspi/dmx_lib.h +++ b/libraspi/dmx_lib.h @@ -32,6 +32,7 @@ class cDemux { friend class cRecord; friend class cPlayback; + public: bool Open(DMX_CHANNEL_TYPE pes_type, void *x = NULL, int y = 0); void Close(void); @@ -43,19 +44,13 @@ class cDemux void SetSyncMode(AVSYNC_TYPE mode); void *getBuffer(); void *getChannel(); - DMX_CHANNEL_TYPE getChannelType(void) - { - return dmx_type; - }; + DMX_CHANNEL_TYPE getChannelType(void) { return dmx_type; }; bool addPid(unsigned short pid); void getSTC(int64_t *STC); int getUnit(void); static bool SetSource(int unit, int source); static int GetSource(int unit); - int getFD(void) - { - return fd; - }; /* needed by cPlayback class */ + int getFD(void) { return fd; }; /* needed by cPlayback class */ cDemux(int num = 0); ~cDemux(); diff --git a/libraspi/glfb.cpp b/libraspi/glfb.cpp index 7040ad0..77237e1 100644 --- a/libraspi/glfb.cpp +++ b/libraspi/glfb.cpp @@ -50,10 +50,10 @@ static VC_IMAGE_TYPE_T type = VC_IMAGE_ARGB8888; static OpenThreads::Mutex blit_mutex; static OpenThreads::Condition blit_cond; -static bool goodbye = false; /* if set main loop is left */ -static bool ready = false; /* condition predicate */ +static bool goodbye = false; /* if set main loop is left */ +static bool ready = false; /* condition predicate */ -static int width; /* width and height, fixed for a framebuffer instance */ +static int width; /* width and height, fixed for a framebuffer instance */ static int height; GLFramebuffer::GLFramebuffer(int x, int y) @@ -126,7 +126,7 @@ void GLFramebuffer::setup() /* 32bit FB depth, *2 because tuxtxt uses a shadow buffer */ osd_buf.resize(pitch * height * 2); hal_info("GLFB: Display is %d x %d, FB is %d x %d, memory size %d\n", - info.width, info.height, width, height, osd_buf.size()); + info.width, info.height, width, height, osd_buf.size()); image = &osd_buf[0]; /* initialize to half-transparent grey */ memset(image, 0x7f, osd_buf.size()); @@ -143,15 +143,15 @@ void GLFramebuffer::setup() vc_dispmanx_rect_set(&src_rect, 0, 0, width << 16, height << 16); vc_dispmanx_rect_set(&dsp_rect, 0, 0, info.width, info.height); element = vc_dispmanx_element_add(update, - display, - 2000 /*layer*/, - &dsp_rect, - res[curr_res], - &src_rect, - DISPMANX_PROTECTION_NONE, - &alpha, - NULL, - DISPMANX_NO_ROTATE); + display, + 2000 /*layer*/, + &dsp_rect, + res[curr_res], + &src_rect, + DISPMANX_PROTECTION_NONE, + &alpha, + NULL, + DISPMANX_NO_ROTATE); ret = vc_dispmanx_update_submit_sync(update); CHECK(ret == 0); curr_res = !curr_res; diff --git a/libraspi/glfb.h b/libraspi/glfb.h index c91393d..112355f 100644 --- a/libraspi/glfb.h +++ b/libraspi/glfb.h @@ -26,18 +26,12 @@ class GLFramebuffer : public OpenThreads::Thread public: GLFramebuffer(int x, int y); ~GLFramebuffer(); - std::vector *getOSDBuffer() - { - return &osd_buf; /* pointer to OSD bounce buffer */ - } + std::vector *getOSDBuffer() { return &osd_buf; } /* pointer to OSD bounce buffer */ void blit(); - fb_var_screeninfo getScreenInfo() - { - return si; - } + fb_var_screeninfo getScreenInfo() { return si; } private: - void *pdata; /* not yet used */ + void *pdata; /* not yet used */ fb_var_screeninfo si; std::vector osd_buf; /* silly bounce buffer */ void run(); /* for OpenThreads::Thread */ diff --git a/libraspi/hardware_caps.c b/libraspi/hardware_caps.c index 6b9009a..bcb2e0a 100644 --- a/libraspi/hardware_caps.c +++ b/libraspi/hardware_caps.c @@ -29,7 +29,7 @@ hw_caps_t *get_hwcaps(void) caps.can_pip = 1; caps.can_cpufreq = 0; - caps.can_shutdown = 1; /* for testing */ + caps.can_shutdown = 1; /* for testing */ caps.display_type = HW_DISPLAY_LINE_TEXT; caps.has_HDMI = 1; caps.display_xres = 8; diff --git a/libraspi/init.cpp b/libraspi/init.cpp index 7c084e9..ff4387b 100644 --- a/libraspi/init.cpp +++ b/libraspi/init.cpp @@ -18,6 +18,7 @@ * for the Raspberry Pi * */ + #include #include #include @@ -49,24 +50,24 @@ static keymap_t kmap; static void init_keymap(void) { /* same as generic-pc/glfb.cpp */ - kmap[KEY_ENTER] = KEY_OK; - kmap[KEY_ESC] = KEY_EXIT; - kmap[KEY_E] = KEY_EPG; - kmap[KEY_I] = KEY_INFO; - kmap[KEY_M] = KEY_MENU; - kmap[KEY_F12] = KEY_VOLUMEUP; /* different than glfb, as we */ - kmap[KEY_F11] = KEY_VOLUMEDOWN; /* don't consider the keyboard */ - kmap[KEY_F10] = KEY_MUTE; /* layout... */ - kmap[KEY_H] = KEY_HELP; - kmap[KEY_P] = KEY_POWER; - kmap[KEY_F1] = KEY_RED; - kmap[KEY_F2] = KEY_GREEN; - kmap[KEY_F3] = KEY_YELLOW; - kmap[KEY_F4] = KEY_BLUE; - kmap[KEY_F5] = KEY_WWW; - kmap[KEY_F6] = KEY_SUBTITLE; - kmap[KEY_F7] = KEY_MOVE; - kmap[KEY_F8] = KEY_SLEEP; + kmap[KEY_ENTER] = KEY_OK; + kmap[KEY_ESC] = KEY_EXIT; + kmap[KEY_E] = KEY_EPG; + kmap[KEY_I] = KEY_INFO; + kmap[KEY_M] = KEY_MENU; + kmap[KEY_F12] = KEY_VOLUMEUP; /* different than glfb, as we */ + kmap[KEY_F11] = KEY_VOLUMEDOWN; /* don't consider the keyboard */ + kmap[KEY_F10] = KEY_MUTE; /* layout... */ + kmap[KEY_H] = KEY_HELP; + kmap[KEY_P] = KEY_POWER; + kmap[KEY_F1] = KEY_RED; + kmap[KEY_F2] = KEY_GREEN; + kmap[KEY_F3] = KEY_YELLOW; + kmap[KEY_F4] = KEY_BLUE; + kmap[KEY_F5] = KEY_WWW; + kmap[KEY_F6] = KEY_SUBTITLE; + kmap[KEY_F7] = KEY_MOVE; + kmap[KEY_F8] = KEY_SLEEP; } class Input: public OpenThreads::Thread diff --git a/libraspi/video.cpp b/libraspi/video.cpp index 1706486..75f9caf 100644 --- a/libraspi/video.cpp +++ b/libraspi/video.cpp @@ -173,7 +173,7 @@ int cVideo::SetStreamType(VIDEO_FORMAT v) bool cVideo::GetScreenImage(unsigned char *&data, int &xres, int &yres, bool get_video, bool get_osd, bool scale_to_video) { hal_info("%s: data 0x%p xres %d yres %d vid %d osd %d scale %d\n", - __func__, data, xres, yres, get_video, get_osd, scale_to_video); + __func__, data, xres, yres, get_video, get_osd, scale_to_video); return false; } diff --git a/libraspi/video_lib.h b/libraspi/video_lib.h index 869279b..406e14a 100644 --- a/libraspi/video_lib.h +++ b/libraspi/video_lib.h @@ -105,7 +105,7 @@ typedef enum VIDEO_STD_1080P24, VIDEO_STD_1080P25, VIDEO_STD_AUTO, - VIDEO_STD_1080P50, /* SPARK only */ + VIDEO_STD_1080P50, /* SPARK only */ VIDEO_STD_MAX } VIDEO_STD; @@ -133,44 +133,21 @@ class cVideo { friend class GLFramebuffer; friend class cDemux; + private: /* called from GL thread */ class SWFramebuffer : public std::vector { public: SWFramebuffer() : mWidth(0), mHeight(0) {} - void width(int w) - { - mWidth = w; - } - void height(int h) - { - mHeight = h; - } - void pts(uint64_t p) - { - mPts = p; - } - void AR(AVRational a) - { - mAR = a; - } - int width() const - { - return mWidth; - } - int height() const - { - return mHeight; - } - int64_t pts() const - { - return mPts; - } - AVRational AR() const - { - return mAR; - } + void width(int w) { mWidth = w; } + void height(int h) { mHeight = h; } + void pts(uint64_t p) { mPts = p; } + void AR(AVRational a) { mAR = a; } + int width() const { return mWidth; } + int height() const { return mHeight; } + int64_t pts() const { return mPts; } + AVRational AR() const { return mAR; } private: int mWidth; int mHeight; @@ -179,19 +156,14 @@ class cVideo }; int buf_in, buf_out, buf_num; int64_t GetPTS(void); + public: /* constructor & destructor */ cVideo(int mode, void *, void *, unsigned int unit = 0); ~cVideo(void); - void *GetTVEnc() - { - return NULL; - }; - void *GetTVEncSD() - { - return NULL; - }; + void *GetTVEnc() { return NULL; }; + void *GetTVEncSD() { return NULL; }; /* aspect ratio */ int getAspectRatio(void); @@ -217,58 +189,26 @@ class cVideo int SetVideoSystem(int video_system, bool remember = true); int SetStreamType(VIDEO_FORMAT type); void SetSyncMode(AVSYNC_TYPE mode); - bool SetCECMode(VIDEO_HDMI_CEC_MODE) - { - return true; - }; - void SetCECAutoView(bool) - { - return; - }; - void SetCECAutoStandby(bool) - { - return; - }; + bool SetCECMode(VIDEO_HDMI_CEC_MODE) { return true; }; + void SetCECAutoView(bool) { return; }; + void SetCECAutoStandby(bool) { return; }; bool ShowPicture(const char *fname); void StopPicture(); void Standby(unsigned int bOn); void Pig(int x, int y, int w, int h, int osd_w = 1064, int osd_h = 600); - void SetControl(int, int) - { - return; - }; + void SetControl(int, int) { return; }; void setContrast(int val); void SetVideoMode(analog_mode_t mode); - void SetDBDR(int) - { - return; - }; - void SetAudioHandle(void *) - { - return; - }; - void SetAutoModes(int [VIDEO_STD_MAX]) - { - return; - }; - int OpenVBI(int) - { - return 0; - }; - int CloseVBI(void) - { - return 0; - }; - int StartVBI(unsigned short) - { - return 0; - }; - int StopVBI(void) - { - return 0; - }; + void SetDBDR(int) { return; }; + void SetAudioHandle(void *) { return; }; + void SetAutoModes(int [VIDEO_STD_MAX]) { return; }; + int OpenVBI(int) { return 0; }; + int CloseVBI(void) { return 0; }; + int StartVBI(unsigned short) { return 0; }; + int StopVBI(void) { return 0; }; void SetDemux(cDemux *dmx); bool GetScreenImage(unsigned char *&data, int &xres, int &yres, bool get_video = true, bool get_osd = false, bool scale_to_video = false); + private: SWFramebuffer buffers[VDEC_MAXBUFS]; int dec_w, dec_h; diff --git a/libspark/record.cpp b/libspark/record.cpp index 3dcb96b..7c011aa 100644 --- a/libspark/record.cpp +++ b/libspark/record.cpp @@ -270,8 +270,7 @@ void cRecord::RecordThread() if (toread > readsize) toread = readsize; ssize_t s = dmx->Read(buf + buf_pos, toread, 50); - hal_debug("%s: buf_pos %6d s %6d / %6d\n", __func__, - buf_pos, (int)s, bufsize - buf_pos); + hal_debug("%s: buf_pos %6d s %6d / %6d\n", __func__, buf_pos, (int)s, bufsize - buf_pos); if (s < 0) { if (errno != EAGAIN && (errno != EOVERFLOW || !overflow)) @@ -312,7 +311,7 @@ void cRecord::RecordThread() hal_debug("%s: aio in progress, free: %d\n", __func__, bufsize - buf_pos); continue; } - // not calling aio_return causes a memory leak --martii + // not calling aio_return causes a memory leak --martii r = aio_return(&a); if (r < 0) { diff --git a/libspark/record_lib.h b/libspark/record_lib.h index 8cde3f6..bbe407d 100644 --- a/libspark/record_lib.h +++ b/libspark/record_lib.h @@ -16,7 +16,7 @@ typedef enum RECORD_FAILED_READ, /* failed to read from DMX */ RECORD_FAILED_OVERFLOW, /* cannot write fast enough */ RECORD_FAILED_FILE, /* cannot write to file */ - RECORD_FAILED_MEMORY /* out of memory */ + RECORD_FAILED_MEMORY /* out of memory */ } record_state_t; class cRecord @@ -38,20 +38,17 @@ class cRecord #define RECORD_WRITER_CHUNKS 16 unsigned char *io_buf[RECORD_WRITER_CHUNKS]; size_t io_len[RECORD_WRITER_CHUNKS]; + public: cRecord(int num = 0, int bs_dmx = 2048 * 1024, int bs = 4096 * 1024); - void setFailureCallback(void (*f)(void *), void *d) - { - failureCallback = f; - failureData = d; - } + void setFailureCallback(void (*f)(void *), void *d) { failureCallback = f; failureData = d; } ~cRecord(); bool Open(); bool Start(int fd, unsigned short vpid, unsigned short *apids, int numapids, uint64_t ch = 0); bool Stop(void); bool AddPid(unsigned short pid); - int GetStatus(); + int GetStatus(); void ResetStatus(); bool ChangePids(unsigned short vpid, unsigned short *apids, int numapids);