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
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
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
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
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
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