MythTV  0.26-pre
audiooutput.h
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends