diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2011-08-06 10:07:36 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2011-08-06 10:07:36 +0000 |
| commit | 9d35f2ce0e9e2816022b06819551312c182b4713 (patch) | |
| tree | 86d4b6e56665902a423095bf96727c926c4bad55 /src/plugins/Output | |
| parent | 7e107ff8feb4b4f1c8c4e79a364503bbfed118f8 (diff) | |
| download | qmmp-9d35f2ce0e9e2816022b06819551312c182b4713.tar.gz qmmp-9d35f2ce0e9e2816022b06819551312c182b4713.tar.bz2 qmmp-9d35f2ce0e9e2816022b06819551312c182b4713.zip | |
some output plugin api changes
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@2292 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Output')
| -rw-r--r-- | src/plugins/Output/alsa/outputalsa.cpp | 53 | ||||
| -rw-r--r-- | src/plugins/Output/alsa/outputalsa.h | 3 | ||||
| -rw-r--r-- | src/plugins/Output/jack/outputjack.cpp | 39 | ||||
| -rw-r--r-- | src/plugins/Output/jack/outputjack.h | 5 | ||||
| -rw-r--r-- | src/plugins/Output/null/outputnull.cpp | 10 | ||||
| -rw-r--r-- | src/plugins/Output/null/outputnull.h | 4 | ||||
| -rw-r--r-- | src/plugins/Output/oss/outputoss.cpp | 93 | ||||
| -rw-r--r-- | src/plugins/Output/oss/outputoss.h | 3 | ||||
| -rw-r--r-- | src/plugins/Output/oss4/outputoss4.cpp | 107 | ||||
| -rw-r--r-- | src/plugins/Output/oss4/outputoss4.h | 1 | ||||
| -rw-r--r-- | src/plugins/Output/pulseaudio/outputpulseaudio.cpp | 8 | ||||
| -rw-r--r-- | src/plugins/Output/pulseaudio/outputpulseaudio.h | 5 |
12 files changed, 140 insertions, 191 deletions
diff --git a/src/plugins/Output/alsa/outputalsa.cpp b/src/plugins/Output/alsa/outputalsa.cpp index 2270d8a94..7a0cc9f0a 100644 --- a/src/plugins/Output/alsa/outputalsa.cpp +++ b/src/plugins/Output/alsa/outputalsa.cpp @@ -56,8 +56,19 @@ OutputALSA::~OutputALSA() free (pcm_name); } -void OutputALSA::configure(quint32 freq, int chan, Qmmp::AudioFormat format) +bool OutputALSA::initialize(quint32 freq, int chan, Qmmp::AudioFormat format) { + m_inited = false; + + if (pcm_handle) + return false; + + if (snd_pcm_open(&pcm_handle, pcm_name, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK) < 0) + { + qWarning ("OutputALSA: Error opening PCM device %s", pcm_name); + return false; + } + // we need to configure uint rate = freq; /* Sample rate */ @@ -80,7 +91,7 @@ void OutputALSA::configure(quint32 freq, int chan, Qmmp::AudioFormat format) if ((err = snd_pcm_hw_params_any(pcm_handle, hwparams)) < 0) { qWarning("OutputALSA: Can not read configuration for PCM device: %s", snd_strerror(err)); - return; + return false; } if (m_use_mmap) { @@ -95,7 +106,7 @@ void OutputALSA::configure(quint32 freq, int chan, Qmmp::AudioFormat format) if ((err = snd_pcm_hw_params_set_access(pcm_handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { qWarning("OutputALSA: Error setting access: %s", snd_strerror(err)); - return; + return false; } } snd_pcm_format_t alsa_format = SND_PCM_FORMAT_UNKNOWN; @@ -115,19 +126,19 @@ void OutputALSA::configure(quint32 freq, int chan, Qmmp::AudioFormat format) break; default: qWarning("OutputALSA: unsupported format detected"); - return; + return false; } if ((err = snd_pcm_hw_params_set_format(pcm_handle, hwparams, alsa_format)) < 0) { qDebug("OutputALSA: Error setting format: %s", snd_strerror(err)); - return; + return false; } exact_rate = rate; if ((err = snd_pcm_hw_params_set_rate_near(pcm_handle, hwparams, &exact_rate, 0)) < 0) { qWarning("OutputALSA: Error setting rate: %s", snd_strerror(err)); - return; + return false; } if (rate != exact_rate) { @@ -137,22 +148,22 @@ void OutputALSA::configure(quint32 freq, int chan, Qmmp::AudioFormat format) if ((err = snd_pcm_hw_params_set_channels_near(pcm_handle, hwparams, &c)) < 0) { qWarning("OutputALSA: Error setting channels: %s", snd_strerror(err)); - return; + return false; } if ((err = snd_pcm_hw_params_set_period_time_near(pcm_handle, hwparams, &period_time ,0)) < 0) { qWarning("OutputALSA: Error setting period time: %s", snd_strerror(err)); - return; + return false; } if ((err = snd_pcm_hw_params_set_buffer_time_near(pcm_handle, hwparams, &buffer_time ,0)) < 0) { qWarning("OutputALSA: Error setting buffer time: %s", snd_strerror(err)); - return; + return false; } if ((err = snd_pcm_hw_params(pcm_handle, hwparams)) < 0) { qWarning("OutputALSA: Error setting HW params: %s", snd_strerror(err)); - return; + return false; } //read some alsa parameters snd_pcm_uframes_t buffer_size = 0; @@ -160,12 +171,12 @@ void OutputALSA::configure(quint32 freq, int chan, Qmmp::AudioFormat format) if ((err = snd_pcm_hw_params_get_buffer_size(hwparams, &buffer_size)) < 0) { qWarning("OutputALSA: Error reading buffer size: %s", snd_strerror(err)); - return; + return false; } if ((err = snd_pcm_hw_params_get_period_size(hwparams, &period_size, 0)) < 0) { qWarning("OutputALSA: Error reading period size: %s", snd_strerror(err)); - return; + return false; } //swparams snd_pcm_sw_params_alloca(&swparams); @@ -176,31 +187,17 @@ void OutputALSA::configure(quint32 freq, int chan, Qmmp::AudioFormat format) if ((err = snd_pcm_sw_params(pcm_handle, swparams)) < 0) { qWarning("OutputALSA: Error setting SW params: %s", snd_strerror(err)); - return; + return false; } //setup needed values m_bits_per_frame = snd_pcm_format_physical_width(alsa_format) * chan; m_chunk_size = period_size; m_can_pause = snd_pcm_hw_params_can_pause(hwparams) && use_pause; qDebug("OutputALSA: can pause: %d", m_can_pause); - Output::configure(freq, chan, format); //apply configuration + configure(freq, chan, format); //apply configuration //create alsa prebuffer; m_prebuf_size = /*QMMP_BUFFER_SIZE + */m_bits_per_frame * m_chunk_size / 8; m_prebuf = (uchar *)malloc(m_prebuf_size); -} - -bool OutputALSA::initialize() -{ - m_inited = false; - - if (pcm_handle) - return false; - - if (snd_pcm_open(&pcm_handle, pcm_name, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK) < 0) - { - qWarning ("OutputALSA: Error opening PCM device %s", pcm_name); - return false; - } m_inited = true; return true; diff --git a/src/plugins/Output/alsa/outputalsa.h b/src/plugins/Output/alsa/outputalsa.h index 1af62a2ae..4730afeaa 100644 --- a/src/plugins/Output/alsa/outputalsa.h +++ b/src/plugins/Output/alsa/outputalsa.h @@ -41,8 +41,7 @@ public: OutputALSA(QObject * parent = 0); ~OutputALSA(); - bool initialize(); - void configure(quint32, int, Qmmp::AudioFormat format); + bool initialize(quint32, int, Qmmp::AudioFormat format); qint64 latency(); private: diff --git a/src/plugins/Output/jack/outputjack.cpp b/src/plugins/Output/jack/outputjack.cpp index a08f5efbc..feeccf9d3 100644 --- a/src/plugins/Output/jack/outputjack.cpp +++ b/src/plugins/Output/jack/outputjack.cpp @@ -33,8 +33,7 @@ #define JACK_TIMEOUT 500000L -OutputJACK::OutputJACK(QObject *parent) - : Output(parent), m_inited(false), m_configure(false) +OutputJACK::OutputJACK(QObject *parent) : Output(parent), m_inited(false) { JACK_Init(); m_wait_time = 0; @@ -45,40 +44,16 @@ OutputJACK::~OutputJACK() uninitialize(); } -void OutputJACK::configure(quint32 freq, int chan, Qmmp::AudioFormat format) +bool OutputJACK::initialize(quint32 freq, int chan, Qmmp::AudioFormat format) { - qDebug("OutputJACK: configure"); + qDebug("OutputJACK: initialize"); if(JACK_Open(&jack_device, AudioParameters::sampleSize(format)*8, (unsigned long *)&freq, chan)) { - m_configure = false; m_inited = false; - return; - } - else - m_configure = true; - m_inited = true; - Output::configure(freq, chan, format); - qDebug("OutputJACK: configure end"); -} - -bool OutputJACK::initialize() -{ - m_inited = false; - m_configure = false; - jack_options_t options = JackNoStartServer; - jack_status_t status; - jack_client_t *client = jack_client_open ("test_qmmp", options, &status, NULL); - if (client == NULL) - { - qDebug("jack_client_open() failed."); - if (status & JackServerFailed) - { - qDebug("Unable to connect to JACK server."); - } return false; } - jack_client_close (client); m_inited = true; + configure(freq, chan, format); return true; } @@ -89,7 +64,7 @@ qint64 OutputJACK::latency() qint64 OutputJACK::writeAudio(unsigned char *data, qint64 maxSize) { - if(!m_configure) + if(!m_inited) return -1; m = JACK_Write(jack_device, (unsigned char*)data, maxSize); @@ -115,7 +90,5 @@ void OutputJACK::uninitialize() { if (!m_inited) return; - - if (m_configure) - JACK_Close(jack_device); + JACK_Close(jack_device); } diff --git a/src/plugins/Output/jack/outputjack.h b/src/plugins/Output/jack/outputjack.h index 9f3b8750b..d746ccdcc 100644 --- a/src/plugins/Output/jack/outputjack.h +++ b/src/plugins/Output/jack/outputjack.h @@ -39,8 +39,7 @@ public: OutputJACK(QObject * parent = 0); ~OutputJACK(); - bool initialize(); - void configure(quint32, int, Qmmp::AudioFormat format); + bool initialize(quint32, int, Qmmp::AudioFormat format); qint64 latency(); private: @@ -52,7 +51,7 @@ private: // helper functions void uninitialize(); qint64 m, m_wait_time; - bool m_inited, m_configure; + bool m_inited; int jack_device; }; diff --git a/src/plugins/Output/null/outputnull.cpp b/src/plugins/Output/null/outputnull.cpp index e3aa9f226..75ce14791 100644 --- a/src/plugins/Output/null/outputnull.cpp +++ b/src/plugins/Output/null/outputnull.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2010 by Ilya Kotov * + * Copyright (C) 2010-2011 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -29,7 +29,7 @@ OutputNull::OutputNull(QObject * parent) : Output(parent) OutputNull::~OutputNull() {} -void OutputNull::configure(quint32 freq, int chan, Qmmp::AudioFormat format) +bool OutputNull::initialize(quint32 freq, int chan, Qmmp::AudioFormat format) { switch (format) { @@ -44,11 +44,7 @@ void OutputNull::configure(quint32 freq, int chan, Qmmp::AudioFormat format) default: m_bytes_per_second = freq * chan * 2; } - Output::configure(freq, chan, format); -} - -bool OutputNull::initialize() -{ + configure(freq, chan, format); return true; } diff --git a/src/plugins/Output/null/outputnull.h b/src/plugins/Output/null/outputnull.h index f99441a0f..7dc6260fe 100644 --- a/src/plugins/Output/null/outputnull.h +++ b/src/plugins/Output/null/outputnull.h @@ -34,11 +34,9 @@ public: OutputNull(QObject * parent = 0); ~OutputNull(); - bool initialize(); - void configure(quint32, int, Qmmp::AudioFormat format); + bool initialize(quint32, int, Qmmp::AudioFormat format); qint64 latency(); - private: //output api qint64 writeAudio(unsigned char *data, qint64 maxSize); diff --git a/src/plugins/Output/oss/outputoss.cpp b/src/plugins/Output/oss/outputoss.cpp index 6722f18ad..51031116a 100644 --- a/src/plugins/Output/oss/outputoss.cpp +++ b/src/plugins/Output/oss/outputoss.cpp @@ -60,91 +60,92 @@ OutputOSS::~OutputOSS() } } -void OutputOSS::configure(quint32 freq, int chan, Qmmp::AudioFormat format) +void OutputOSS::post() +{ + ioctl(m_audio_fd, SNDCTL_DSP_POST, 0); +} + +void OutputOSS::sync() +{ + ioctl(m_audio_fd, SNDCTL_DSP_SYNC, 0); +} + +bool OutputOSS::initialize(quint32 freq, int chan, Qmmp::AudioFormat format) { + m_audio_fd = open(m_audio_device.toAscii(), O_WRONLY, 0); + + if (m_audio_fd < 0) + { + qWarning("OSSOutput: failed to open output device '%s'", qPrintable(m_audio_device)); + return false; + } + + int flags; + if ((flags = fcntl(m_audio_fd, F_GETFL, 0)) > 0) + { + flags &= O_NDELAY; + fcntl(m_audio_fd, F_SETFL, flags); + } + fd_set afd; + FD_ZERO(&afd); + FD_SET(m_audio_fd, &afd); + struct timeval tv; + tv.tv_sec = 0l; + tv.tv_usec = 50000l; + do_select = (select(m_audio_fd + 1, 0, &afd, 0, &tv) > 0); + int p; switch (format) { case Qmmp::PCM_S16LE: - p = AFMT_S16_LE; +#ifdef AFMT_S16_NE + p = AFMT_S16_NE; +#else + p = AFMT_S16_LE; +#endif break; case Qmmp::PCM_S8: p = AFMT_S8; break; default: qWarning("OutputOSS: unsupported audio format"); - return; + return false; } int param = p; if (ioctl(m_audio_fd, SNDCTL_DSP_SETFMT, &p) < 0) { qWarning("OutputOSS: ioctl SNDCTL_DSP_SETFMT failed: %s",strerror(errno)); - return; + //return; } - if(param != p) + /*if(param != p) { qWarning("OutputOSS: unsupported audio format"); return; - } + }*/ param = chan; if(ioctl(m_audio_fd, SNDCTL_DSP_CHANNELS, &chan) < 0) { qWarning("OutputOSS: ioctl SNDCTL_DSP_CHANNELS failed: %s", strerror(errno)); - return; + return false; } if(param != chan) { qWarning("OutputOSS: unsupported %d-channel mode", param); - return; + return false; } uint param2 = freq; if (ioctl(m_audio_fd, SNDCTL_DSP_SPEED, &freq) < 0) { qWarning("OutputOSS: ioctl SNDCTL_DSP_SPEED failed: %s", strerror(errno)); - return; + return false; } if(param2 != freq) { qWarning("OutputOSS: unsupported sample rate"); - return; - } - ioctl(m_audio_fd, SNDCTL_DSP_RESET, 0); - Output::configure(freq, chan, format); -} - -void OutputOSS::post() -{ - ioctl(m_audio_fd, SNDCTL_DSP_POST, 0); -} - -void OutputOSS::sync() -{ - ioctl(m_audio_fd, SNDCTL_DSP_SYNC, 0); -} - -bool OutputOSS::initialize() -{ - m_audio_fd = open(m_audio_device.toAscii(), O_WRONLY, 0); - - if (m_audio_fd < 0) - { - qWarning("OSSOutput: failed to open output device '%s'", qPrintable(m_audio_device)); return false; } - - int flags; - if ((flags = fcntl(m_audio_fd, F_GETFL, 0)) > 0) - { - flags &= O_NDELAY; - fcntl(m_audio_fd, F_SETFL, flags); - } - fd_set afd; - FD_ZERO(&afd); - FD_SET(m_audio_fd, &afd); - struct timeval tv; - tv.tv_sec = 0l; - tv.tv_usec = 50000l; - do_select = (select(m_audio_fd + 1, 0, &afd, 0, &tv) > 0); + ioctl(m_audio_fd, SNDCTL_DSP_RESET, 0); + configure(freq, chan, format); return true; } diff --git a/src/plugins/Output/oss/outputoss.h b/src/plugins/Output/oss/outputoss.h index c712e83fc..8864339c4 100644 --- a/src/plugins/Output/oss/outputoss.h +++ b/src/plugins/Output/oss/outputoss.h @@ -35,8 +35,7 @@ public: OutputOSS(QObject * parent = 0); virtual ~OutputOSS(); - bool initialize(); - void configure(quint32, int, Qmmp::AudioFormat format); + bool initialize(quint32, int, Qmmp::AudioFormat format); qint64 latency(); private: diff --git a/src/plugins/Output/oss4/outputoss4.cpp b/src/plugins/Output/oss4/outputoss4.cpp index d9c46f2b6..ecd37c504 100644 --- a/src/plugins/Output/oss4/outputoss4.cpp +++ b/src/plugins/Output/oss4/outputoss4.cpp @@ -44,7 +44,6 @@ extern "C" #include <qmmp/visual.h> #include "outputoss4.h" - OutputOSS4 *OutputOSS4::m_instance = 0; OutputOSS4::OutputOSS4(QObject *parent) : Output(parent) @@ -67,8 +66,50 @@ OutputOSS4::~OutputOSS4() m_instance = 0; } -void OutputOSS4::configure(quint32 freq, int chan, Qmmp::AudioFormat format) +int OutputOSS4::fd() +{ + return m_audio_fd; +} + +OutputOSS4 *OutputOSS4::instance() +{ + return m_instance; +} + +void OutputOSS4::post() +{ + ioctl(m_audio_fd, SNDCTL_DSP_POST, 0); +} + +void OutputOSS4::sync() +{ + ioctl(m_audio_fd, SNDCTL_DSP_SYNC, 0); +} + +bool OutputOSS4::initialize(quint32 freq, int chan, Qmmp::AudioFormat format) { + m_audio_fd = open(m_audio_device.toAscii(), O_WRONLY, 0); + + if (m_audio_fd < 0) + { + qWarning("OSS4Output: unable to open output device '%s'; error: %s", + qPrintable(m_audio_device), strerror(errno)); + return false; + } + + int flags; + if ((flags = fcntl(m_audio_fd, F_GETFL, 0)) > 0) + { + flags &= O_NDELAY; + fcntl(m_audio_fd, F_SETFL, flags); + } + fd_set afd; + FD_ZERO(&afd); + FD_SET(m_audio_fd, &afd); + struct timeval tv; + tv.tv_sec = 0l; + tv.tv_usec = 50000l; + m_do_select = (select(m_audio_fd + 1, 0, &afd, 0, &tv) > 0); int p; switch (format) { @@ -86,89 +127,43 @@ void OutputOSS4::configure(quint32 freq, int chan, Qmmp::AudioFormat format) break; default: qWarning("OutputOSS4: unsupported audio format"); - return; + return false; } int param = p; if (ioctl(m_audio_fd, SNDCTL_DSP_SETFMT, &p) < 0) { qWarning("OutputOSS4: ioctl SNDCTL_DSP_SETFMT failed: %s",strerror(errno)); - return; + return false; } if(param != p) { qWarning("OutputOSS4: unsupported audio format"); - return; + return false; } param = chan; if(ioctl(m_audio_fd, SNDCTL_DSP_CHANNELS, &chan) < 0) { qWarning("OutputOSS4: ioctl SNDCTL_DSP_CHANNELS failed: %s", strerror(errno)); - return; + return false; } if(param != chan) { qWarning("OutputOSS4: unsupported %d-channel mode", param); - return; + return false; } uint param2 = freq; if (ioctl(m_audio_fd, SNDCTL_DSP_SPEED, &freq) < 0) { qWarning("OutputOSS4: ioctl SNDCTL_DSP_SPEED failed: %s", strerror(errno)); - return; + return false; } if(param2 != freq) { qWarning("OutputOSS4: unsupported sample rate"); - return; - } - ioctl(m_audio_fd, SNDCTL_DSP_RESET, 0); - Output::configure(freq, chan, format); -} - -int OutputOSS4::fd() -{ - return m_audio_fd; -} - -OutputOSS4 *OutputOSS4::instance() -{ - return m_instance; -} - -void OutputOSS4::post() -{ - ioctl(m_audio_fd, SNDCTL_DSP_POST, 0); -} - -void OutputOSS4::sync() -{ - ioctl(m_audio_fd, SNDCTL_DSP_SYNC, 0); -} - -bool OutputOSS4::initialize() -{ - m_audio_fd = open(m_audio_device.toAscii(), O_WRONLY, 0); - - if (m_audio_fd < 0) - { - qWarning("OSS4Output: unable to open output device '%s'; error: %s", - qPrintable(m_audio_device), strerror(errno)); return false; } - - int flags; - if ((flags = fcntl(m_audio_fd, F_GETFL, 0)) > 0) - { - flags &= O_NDELAY; - fcntl(m_audio_fd, F_SETFL, flags); - } - fd_set afd; - FD_ZERO(&afd); - FD_SET(m_audio_fd, &afd); - struct timeval tv; - tv.tv_sec = 0l; - tv.tv_usec = 50000l; - m_do_select = (select(m_audio_fd + 1, 0, &afd, 0, &tv) > 0); + ioctl(m_audio_fd, SNDCTL_DSP_RESET, 0); + configure(freq, chan, format); return true; } diff --git a/src/plugins/Output/oss4/outputoss4.h b/src/plugins/Output/oss4/outputoss4.h index a9d1bd608..fecd396c6 100644 --- a/src/plugins/Output/oss4/outputoss4.h +++ b/src/plugins/Output/oss4/outputoss4.h @@ -39,7 +39,6 @@ public: bool initialize(); void configure(quint32, int, Qmmp::AudioFormat format); - qint64 latency(); int fd(); static OutputOSS4 *instance(); diff --git a/src/plugins/Output/pulseaudio/outputpulseaudio.cpp b/src/plugins/Output/pulseaudio/outputpulseaudio.cpp index 5d3d00547..99a5b4712 100644 --- a/src/plugins/Output/pulseaudio/outputpulseaudio.cpp +++ b/src/plugins/Output/pulseaudio/outputpulseaudio.cpp @@ -34,7 +34,7 @@ OutputPulseAudio::~OutputPulseAudio() uninitialize(); } -void OutputPulseAudio::configure(quint32 freq, int chan, Qmmp::AudioFormat format) +bool OutputPulseAudio::initialize(quint32 freq, int chan, Qmmp::AudioFormat format) { pa_sample_spec ss; @@ -72,13 +72,9 @@ void OutputPulseAudio::configure(quint32 freq, int chan, Qmmp::AudioFormat forma if (!m_connection) { qWarning("OutputPulseAudio: pa_simple_new() failed: %s", pa_strerror(error)); - return; + return false; } Output::configure(freq, chan, format); -} - -bool OutputPulseAudio::initialize() -{ return true; } diff --git a/src/plugins/Output/pulseaudio/outputpulseaudio.h b/src/plugins/Output/pulseaudio/outputpulseaudio.h index dcff616ff..bc6cc71c8 100644 --- a/src/plugins/Output/pulseaudio/outputpulseaudio.h +++ b/src/plugins/Output/pulseaudio/outputpulseaudio.h @@ -37,8 +37,7 @@ public: OutputPulseAudio(QObject * parent = 0); ~OutputPulseAudio(); - bool initialize(); - void configure(quint32, int, Qmmp::AudioFormat format); + bool initialize(quint32, int, Qmmp::AudioFormat format); qint64 latency(); private: @@ -49,9 +48,7 @@ private: // helper functions void uninitialize(); - pa_simple *m_connection; }; - #endif // OUTPUTPULSEAUDIO_H |
