00001 #include <cstdio>
00002 #include <cstdlib>
00003 #include <fcntl.h>
00004 #include <sys/time.h>
00005 #include <unistd.h>
00006 #include <time.h>
00007 #ifndef USING_MINGW
00008 #include <sys/ioctl.h>
00009 #else
00010 #include "compat.h"
00011 #endif
00012 #include <cerrno>
00013 #include <cstring>
00014 #include <iostream>
00015 #include <qdatetime.h>
00016 #include "config.h"
00017
00018 using namespace std;
00019
00020 #include "mythcontext.h"
00021 #include "audiooutputnull.h"
00022
00023 AudioOutputNULL::AudioOutputNULL(
00024 QString laudio_main_device, QString laudio_passthru_device,
00025 int laudio_bits, int laudio_channels,
00026 int laudio_samplerate, AudioOutputSource lsource,
00027 bool lset_initial_vol, bool laudio_passthru) :
00028 AudioOutputBase(laudio_main_device, laudio_passthru_device,
00029 laudio_bits, laudio_channels,
00030 laudio_samplerate, lsource,
00031 lset_initial_vol, laudio_passthru),
00032 pcm_output_buffer_mutex(false),
00033 current_buffer_size(0),
00034 locked_audio_channels(laudio_channels),
00035 locked_audio_bits(laudio_bits),
00036 locked_audio_samplerate(laudio_samplerate)
00037 {
00038 bzero(pcm_output_buffer, sizeof(char) * NULLAUDIO_OUTPUT_BUFFER_SIZE);
00039
00040 Reconfigure(laudio_bits, laudio_channels,
00041 laudio_samplerate, laudio_passthru);
00042 }
00043
00044 AudioOutputNULL::~AudioOutputNULL()
00045 {
00046 KillAudio();
00047 }
00048
00049 bool AudioOutputNULL::OpenDevice()
00050 {
00051 VERBOSE(VB_GENERAL, "Opening NULL audio device.");
00052
00053 fragment_size = NULLAUDIO_OUTPUT_BUFFER_SIZE / 2;
00054 soundcard_buffer_size = NULLAUDIO_OUTPUT_BUFFER_SIZE;
00055
00056 audio_bits = locked_audio_bits;
00057 audio_channels = locked_audio_channels;
00058 audio_samplerate = locked_audio_samplerate;
00059
00060 return true;
00061 }
00062
00063 void AudioOutputNULL::CloseDevice()
00064 {
00065 }
00066
00067
00068 void AudioOutputNULL::WriteAudio(unsigned char* aubuf, int size)
00069 {
00070 if (buffer_output_data_for_use)
00071 {
00072 if (size + current_buffer_size > NULLAUDIO_OUTPUT_BUFFER_SIZE)
00073 {
00074 VERBOSE(VB_IMPORTANT, "null audio output should not have just "
00075 "had data written to it");
00076 return;
00077 }
00078 pcm_output_buffer_mutex.lock();
00079 memcpy(pcm_output_buffer + current_buffer_size, aubuf, size);
00080 current_buffer_size += size;
00081 pcm_output_buffer_mutex.unlock();
00082 }
00083 }
00084
00085 int AudioOutputNULL::readOutputData(unsigned char *read_buffer, int max_length)
00086 {
00087 int amount_to_read = max_length;
00088 if (amount_to_read > current_buffer_size)
00089 {
00090 amount_to_read = current_buffer_size;
00091 }
00092
00093 pcm_output_buffer_mutex.lock();
00094 memcpy(read_buffer, pcm_output_buffer, amount_to_read);
00095 memmove(pcm_output_buffer, pcm_output_buffer + amount_to_read,
00096 current_buffer_size - amount_to_read);
00097 current_buffer_size -= amount_to_read;
00098 pcm_output_buffer_mutex.unlock();
00099
00100 return amount_to_read;
00101 }
00102
00103 void AudioOutputNULL::Reset()
00104 {
00105 if (buffer_output_data_for_use)
00106 {
00107 pcm_output_buffer_mutex.lock();
00108 current_buffer_size = 0;
00109 pcm_output_buffer_mutex.unlock();
00110 }
00111 AudioOutputBase::Reset();
00112 }
00113
00114 inline int AudioOutputNULL::getBufferedOnSoundcard(void)
00115 {
00116 if (buffer_output_data_for_use)
00117 {
00118 return current_buffer_size;
00119 }
00120
00121 return 0;
00122 }
00123
00124
00125 inline int AudioOutputNULL::getSpaceOnSoundcard(void)
00126 {
00127 if (buffer_output_data_for_use)
00128 {
00129 return NULLAUDIO_OUTPUT_BUFFER_SIZE - current_buffer_size;
00130 }
00131 else
00132 {
00133 return NULLAUDIO_OUTPUT_BUFFER_SIZE;
00134 }
00135 }
00136