00001 #include <cstdio>
00002 #include <cstdlib>
00003
00004
00005 using namespace std;
00006
00007 #include "mythcontext.h"
00008 #include "audiooutputarts.h"
00009
00010 AudioOutputARTS::AudioOutputARTS(
00011 QString laudio_main_device, QString laudio_passthru_device,
00012 int laudio_bits, int laudio_channels,
00013 int laudio_samplerate, AudioOutputSource lsource,
00014 bool lset_initial_vol, bool laudio_passthru) :
00015 AudioOutputBase(laudio_main_device, laudio_passthru_device,
00016 laudio_bits, laudio_channels,
00017 laudio_samplerate, lsource,
00018 lset_initial_vol, laudio_passthru),
00019 pcm_handle(NULL), buff_size(-1), can_hw_pause(false)
00020 {
00021
00022 Reconfigure(laudio_bits, laudio_channels,
00023 laudio_samplerate, laudio_passthru);
00024 }
00025
00026 AudioOutputARTS::~AudioOutputARTS()
00027 {
00028
00029 KillAudio();
00030 }
00031
00032 void AudioOutputARTS::CloseDevice()
00033 {
00034 if (pcm_handle != NULL)
00035 arts_close_stream(pcm_handle);
00036
00037 pcm_handle = NULL;
00038 }
00039
00040 bool AudioOutputARTS::OpenDevice()
00041 {
00042 arts_stream_t stream;
00043 int err;
00044
00045 if (pcm_handle)
00046 {
00047 arts_close_stream(pcm_handle);
00048 arts_free();
00049 pcm_handle=NULL;
00050 }
00051
00052 VERBOSE(VB_GENERAL, QString("Opening ARTS audio device '%1'.")
00053 .arg(audio_main_device));
00054 err = arts_init();
00055 if (err < 0)
00056 {
00057 Error(QString("Opening ARTS sound device failed, the error was: %1")
00058 .arg(arts_error_text(err)));
00059 return false;
00060 }
00061 stream = arts_play_stream(audio_samplerate, audio_bits, audio_channels,
00062 "mythtv");
00063
00064 buff_size = arts_stream_get(stream, ARTS_P_BUFFER_SIZE) +
00065 (arts_stream_get(stream, ARTS_P_SERVER_LATENCY) *
00066 audio_bits * audio_channels * audio_samplerate / 8);
00067
00068 pcm_handle = stream;
00069
00070
00071 return true;
00072 }
00073
00074 void AudioOutputARTS::WriteAudio(unsigned char *aubuf, int size)
00075 {
00076 int err;
00077
00078 if (pcm_handle == NULL)
00079 return;
00080
00081 err = arts_write(pcm_handle, aubuf, size);
00082 if (err < 0)
00083 {
00084
00085 VERBOSE(VB_IMPORTANT, QString("Write error: %1")
00086 .arg(arts_error_text(err)));
00087 return;
00088 }
00089 }
00090
00091 inline int AudioOutputARTS::getBufferedOnSoundcard(void)
00092 {
00093 return buff_size - getSpaceOnSoundcard();
00094 }
00095
00096 inline int AudioOutputARTS::getSpaceOnSoundcard(void)
00097 {
00098 return arts_stream_get(pcm_handle, ARTS_P_BUFFER_SIZE);
00099 }
00100
00101 int AudioOutputARTS::GetVolumeChannel(int )
00102 {
00103
00104 return 100;
00105 }
00106 void AudioOutputARTS::SetVolumeChannel(int , int )
00107 {
00108
00109 }
00110