|
MythTV
0.26-pre
|
00001 #ifndef AUDIOOUTPUT 00002 #define AUDIOOUTPUT 00003 00004 #include <QString> 00005 #include <QVector> 00006 00007 #include "compat.h" 00008 #include "audiosettings.h" 00009 #include "audiooutputsettings.h" 00010 #include "mythcorecontext.h" 00011 #include "volumebase.h" 00012 #include "output.h" 00013 00014 class MPUBLIC AudioOutput : public VolumeBase, public OutputListeners 00015 { 00016 public: 00017 class AudioDeviceConfig 00018 { 00019 public: 00020 QString name; 00021 QString desc; 00022 AudioOutputSettings settings; 00023 AudioDeviceConfig(void) : 00024 name(QString()), desc(QString()), 00025 settings(AudioOutputSettings(true)) { }; 00026 AudioDeviceConfig(const QString &name, 00027 const QString &desc) : 00028 name(name), desc(desc), 00029 settings(AudioOutputSettings(true)) { }; 00030 }; 00031 00032 typedef QVector<AudioDeviceConfig> ADCVect; 00033 00034 static void Cleanup(void); 00035 static ADCVect* GetOutputList(void); 00036 static AudioDeviceConfig* GetAudioDeviceConfig( 00037 QString &name, QString &desc, bool willsuspendpa = false); 00038 00039 // opens one of the concrete subclasses 00040 static AudioOutput *OpenAudio( 00041 const QString &audiodevice, const QString &passthrudevice, 00042 AudioFormat format, int channels, int codec, int samplerate, 00043 AudioOutputSource source, bool set_initial_vol, bool passthru, 00044 int upmixer_startup = 0, AudioOutputSettings *custom = NULL); 00045 static AudioOutput *OpenAudio(AudioSettings &settings, 00046 bool willsuspendpa = true); 00047 static AudioOutput *OpenAudio( 00048 const QString &main_device, 00049 const QString &passthru_device = QString::null, 00050 bool willsuspendpa = true); 00051 00052 AudioOutput() : 00053 VolumeBase(), OutputListeners(), 00054 lastError(QString::null), lastWarn(QString::null) {} 00055 00056 virtual ~AudioOutput(); 00057 00058 // reconfigure sound out for new params 00059 virtual void Reconfigure(const AudioSettings &settings) = 0; 00060 00061 virtual void SetStretchFactor(float factor); 00062 virtual float GetStretchFactor(void) const { return 1.0f; } 00063 virtual int GetChannels(void) const { return 2; } 00064 virtual AudioFormat GetFormat(void) const { return FORMAT_S16; }; 00065 virtual int GetBytesPerFrame(void) const { return 4; }; 00066 00067 virtual AudioOutputSettings* GetOutputSettingsCleaned(bool digital = true); 00068 virtual AudioOutputSettings* GetOutputSettingsUsers(bool digital = true); 00069 virtual bool CanPassthrough(int samplerate, int channels, 00070 int codec, int profile) const; 00071 virtual bool CanDownmix(void) const { return false; }; 00072 00073 // dsprate is in 100 * samples/second 00074 virtual void SetEffDsp(int dsprate) = 0; 00075 00076 virtual void Reset(void) = 0; 00077 00078 virtual bool AddFrames(void *buffer, int frames, int64_t timecode) = 0; 00092 virtual bool AddData(void *buffer, int len, 00093 int64_t timecode, int frames) = 0; 00100 virtual bool NeedDecodingBeforePassthrough(void) const { return true; }; 00107 virtual int64_t LengthLastData(void) const { return -1; }; 00108 00109 virtual void SetTimecode(int64_t timecode) = 0; 00110 virtual bool IsPaused(void) const = 0; 00111 virtual void Pause(bool paused) = 0; 00112 virtual void PauseUntilBuffered(void) = 0; 00113 00114 // Wait for all data to finish playing 00115 virtual void Drain(void) = 0; 00116 00117 virtual int64_t GetAudiotime(void) = 0; 00118 00120 virtual int64_t GetAudioBufferedTime(void) { return 0; } 00121 00122 virtual void SetSourceBitrate(int ) { } 00123 00124 QString GetError(void) const { return lastError; } 00125 QString GetWarning(void) const { return lastWarn; } 00126 00127 virtual void GetBufferStatus(uint &fill, uint &total) 00128 { fill = total = 0; } 00129 00130 // Only really used by the AudioOutputNULL object 00131 virtual void bufferOutputData(bool y) = 0; 00132 virtual int readOutputData(unsigned char *read_buffer, 00133 int max_length) = 0; 00134 00135 virtual bool IsUpmixing(void) = 0; 00136 virtual bool ToggleUpmix(void) = 0; 00137 virtual bool CanUpmix(void) = 0; 00138 bool PulseStatus(void) { return pulsewassuspended; } 00139 00140 protected: 00141 void Error(const QString &msg); 00142 void SilentError(const QString &msg); 00143 void Warn(const QString &msg); 00144 void ClearError(void); 00145 void ClearWarning(void); 00146 00147 QString lastError; 00148 QString lastWarn; 00149 bool pulsewassuspended; 00150 }; 00151 00152 #endif
1.7.6.1