From 0bfaccd2eef5162897bd03b1636f7c22321d3547 Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Fri, 1 Nov 2013 21:52:05 +0100 Subject: [PATCH] generic-pc: clean up cAudio header, separate private stuff --- generic-pc/audio.cpp | 92 ++++++++++++++++++++++++----------------- generic-pc/audio_lib.h | 39 ++++------------- generic-pc/audio_priv.h | 53 ++++++++++++++++++++++++ generic-pc/glfb.cpp | 8 ++-- 4 files changed, 120 insertions(+), 72 deletions(-) create mode 100644 generic-pc/audio_priv.h diff --git a/generic-pc/audio.cpp b/generic-pc/audio.cpp index ac2e6ec..53ab656 100644 --- a/generic-pc/audio.cpp +++ b/generic-pc/audio.cpp @@ -23,54 +23,50 @@ #include #include "audio_lib.h" +#include "audio_priv.h" #include "dmx_lib.h" #include "lt_debug.h" #define lt_debug(args...) _lt_debug(HAL_DEBUG_AUDIO, this, args) #define lt_info(args...) _lt_info(HAL_DEBUG_AUDIO, this, args) -#include - -extern "C" { -#include -#include -#include -#include -#include -} /* ffmpeg buf 2k */ #define INBUF_SIZE 0x0800 /* my own buf 16k */ #define DMX_BUF_SZ 0x4000 cAudio * audioDecoder = NULL; +ADec *adec = NULL; + extern cDemux *audioDemux; -static uint8_t *dmxbuf = NULL; -static int bufpos; extern bool HAL_nodec; -static cAudio *gThiz = NULL; - -static ao_device *adevice = NULL; -static ao_sample_format sformat; - -static AVCodecContext *c= NULL; - cAudio::cAudio(void *, void *, void *) { + adec = new ADec(); +} +cAudio::~cAudio(void) +{ + delete adec; +} + +ADec::ADec(void) +{ + adevice = NULL; + dmxbuf = NULL; + bufpos = 0; + c = NULL; thread_started = false; if (!HAL_nodec) dmxbuf = (uint8_t *)malloc(DMX_BUF_SZ); bufpos = 0; curr_pts = 0; - gThiz = this; ao_initialize(); } -cAudio::~cAudio(void) +ADec::~ADec(void) { - closeDevice(); free(dmxbuf); if (adevice) ao_close(adevice); @@ -78,19 +74,19 @@ cAudio::~cAudio(void) ao_shutdown(); } -void cAudio::openDevice(void) +int cAudio::mute(void) { - lt_debug("%s\n", __func__); + return SetMute(true); } -void cAudio::closeDevice(void) +int cAudio::unmute(void) { - lt_debug("%s\n", __func__); + return SetMute(false); } -int cAudio::do_mute(bool enable, bool remember) +int cAudio::SetMute(bool enable) { - lt_debug("%s(%d, %d)\n", __func__, enable, remember); + lt_debug("%s(%d)\n", __func__, enable); return 0; } @@ -101,21 +97,31 @@ int cAudio::setVolume(unsigned int left, unsigned int right) } int cAudio::Start(void) +{ + return adec->Start(); +} + +int cAudio::Stop(void) +{ + return adec->Stop(); +} + +int ADec::Start(void) { lt_debug("%s >\n", __func__); if (! HAL_nodec) - OpenThreads::Thread::start(); + start(); lt_debug("%s <\n", __func__); return 0; } -int cAudio::Stop(void) +int ADec::Stop(void) { lt_debug("%s >\n", __func__); if (thread_started) { thread_started = false; - OpenThreads::Thread::join(); + join(); } lt_debug("%s <\n", __func__); return 0; @@ -142,6 +148,11 @@ int cAudio::setChannel(int /*channel*/) }; int cAudio::PrepareClipPlay(int ch, int srate, int bits, int le) +{ + return adec->PrepareClipPlay(ch, srate, bits, le); +} + +int ADec::PrepareClipPlay(int ch, int srate, int bits, int le) { lt_debug("%s ch %d srate %d bits %d le %d adevice %p\n", __func__, ch, srate, bits, le, adevice);; int driver; @@ -168,6 +179,11 @@ int cAudio::PrepareClipPlay(int ch, int srate, int bits, int le) }; int cAudio::WriteClip(unsigned char *buffer, int size) +{ + return adec->WriteClip(buffer, size); +} + +int ADec::WriteClip(unsigned char *buffer, int size) { lt_debug("cAudio::%s buf 0x%p size %d\n", __func__, buffer, size); if (!adevice) { @@ -195,6 +211,11 @@ int cAudio::StopClip() }; void cAudio::getAudioInfo(int &type, int &layer, int &freq, int &bitrate, int &mode) +{ + adec->getAudioInfo(type, layer, freq, bitrate, mode); +} + +void ADec::getAudioInfo(int &type, int &layer, int &freq, int &bitrate, int &mode) { type = 0; layer = 0; /* not used */ @@ -269,17 +290,12 @@ void cAudio::EnableAnalogOut(bool enable) lt_debug("%s %d\n", __func__, enable); }; -void cAudio::setBypassMode(bool disable) -{ - lt_debug("%s %d\n", __func__, disable); -} - static int _my_read(void *, uint8_t *buf, int buf_size) { - return gThiz->my_read(buf, buf_size); + return adec->my_read(buf, buf_size); } -int cAudio::my_read(uint8_t *buf, int buf_size) +int ADec::my_read(uint8_t *buf, int buf_size) { int tmp = 0; if (audioDecoder && bufpos < DMX_BUF_SZ - 4096) { @@ -306,7 +322,7 @@ int cAudio::my_read(uint8_t *buf, int buf_size) return tmp; } -void cAudio::run() +void ADec::run() { lt_info("====================== start decoder thread ================================\n"); /* libavcodec & friends */ diff --git a/generic-pc/audio_lib.h b/generic-pc/audio_lib.h index e4b13c3..f474fb6 100644 --- a/generic-pc/audio_lib.h +++ b/generic-pc/audio_lib.h @@ -4,7 +4,6 @@ #define _AUDIO_LIB_H_ #include -#include #include typedef enum @@ -38,46 +37,23 @@ typedef enum AUDIO_FMT_ADVANCED = AUDIO_FMT_MLP } AUDIO_FORMAT; -class cAudio : public OpenThreads::Thread +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_num; /* oss mixer to use, if any */ - - AUDIO_FORMAT StreamType; - AUDIO_SYNC_MODE SyncMode; - bool started; - bool thread_started; - - int volume; - int64_t curr_pts; - - void openDevice(void); - void closeDevice(void); - - int do_mute(bool enable, bool remember); - void setBypassMode(bool disable); - void run(); public: /* construct & destruct */ cAudio(void *, void *, void *); ~cAudio(void); - int64_t getPts() { return curr_pts; } 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(void); + int unmute(void); + int SetMute(bool enable); /* volume, min = 0, max = 255 */ int setVolume(unsigned int left, unsigned int right); int getVolume(void) { return volume;} - bool getMuteStatus(void) { return Muted; }; + bool getMuteStatus(void) { return muted; }; /* start and stop audio */ int Start(void); @@ -98,7 +74,10 @@ class cAudio : public OpenThreads::Thread void SetSpdifDD(bool enable); void ScheduleMute(bool On); void EnableAnalogOut(bool enable); - int my_read(uint8_t *buf, int buf_size); + private: + bool muted; + int volume; + void *pdata; }; #endif diff --git a/generic-pc/audio_priv.h b/generic-pc/audio_priv.h new file mode 100644 index 0000000..304d5dc --- /dev/null +++ b/generic-pc/audio_priv.h @@ -0,0 +1,53 @@ +/* + * (C) 2010-2013 Stefan Seyfried + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * private stuff for the audio decoder, only used inside libstb-hal + */ + +#include + +extern "C" { +#include +#include +#include +#include +#include +} + +class ADec : public OpenThreads::Thread +{ +public: + ADec(); + ~ADec(); + int Start(); + int Stop(); + int PrepareClipPlay(int ch, int srate, int bits, int le); + int WriteClip(unsigned char *buffer, int size); + void getAudioInfo(int &type, int &layer, int &freq, int &bitrate, int &mode); + int my_read(uint8_t *buf, int buf_size); + int64_t getPts() { return curr_pts; }; +private: + bool thread_started; + int64_t curr_pts; + void run(); + + ao_device *adevice; + ao_sample_format sformat; + uint8_t *dmxbuf; + int bufpos; + AVCodecContext *c; +}; + diff --git a/generic-pc/glfb.cpp b/generic-pc/glfb.cpp index 4eb0e10..1de9782 100644 --- a/generic-pc/glfb.cpp +++ b/generic-pc/glfb.cpp @@ -39,7 +39,7 @@ #include #include "glfb_priv.h" #include "video_priv.h" -#include "audio_lib.h" +#include "audio_priv.h" #include "lt_debug.h" @@ -50,7 +50,7 @@ extern VDec *vdec; -extern cAudio *audioDecoder; +extern ADec *adec; /* the private class that does stuff only needed inside libstb-hal. * is used e.g. by cVideo... */ @@ -596,8 +596,8 @@ void GLFbPC::bltDisplayBuffer() * better this than nothing... :-) */ int64_t apts = 0; int64_t vpts = buf->pts(); - if (audioDecoder) - apts = audioDecoder->getPts(); + if (adec) + apts = adec->getPts(); if (apts != last_apts) { int rate, dummy1, dummy2; if (apts < vpts)