diff options
Diffstat (limited to 'src/multimedia/audio/qaudiooutput_alsa_p.cpp')
-rw-r--r-- | src/multimedia/audio/qaudiooutput_alsa_p.cpp | 66 |
1 files changed, 47 insertions, 19 deletions
diff --git a/src/multimedia/audio/qaudiooutput_alsa_p.cpp b/src/multimedia/audio/qaudiooutput_alsa_p.cpp index d814d971ee..020a1044d2 100644 --- a/src/multimedia/audio/qaudiooutput_alsa_p.cpp +++ b/src/multimedia/audio/qaudiooutput_alsa_p.cpp @@ -52,6 +52,7 @@ #include <QtCore/qcoreapplication.h> #include "qaudiooutput_alsa_p.h" +#include "qaudiodeviceinfo_alsa_p.h" QT_BEGIN_NAMESPACE @@ -77,7 +78,7 @@ QAudioOutputPrivate::QAudioOutputPrivate(const QByteArray &device, const QAudioF intervalTime = 1000; audioBuffer = 0; errorState = QAudio::NoError; - deviceState = QAudio::StopState; + deviceState = QAudio::StoppedState; audioSource = 0; pullMode = true; resuming = false; @@ -215,8 +216,8 @@ int QAudioOutputPrivate::setFormat() QIODevice* QAudioOutputPrivate::start(QIODevice* device) { - if(deviceState != QAudio::StopState) - deviceState = QAudio::StopState; + if(deviceState != QAudio::StoppedState) + deviceState = QAudio::StoppedState; errorState = QAudio::NoError; @@ -256,9 +257,9 @@ QIODevice* QAudioOutputPrivate::start(QIODevice* device) void QAudioOutputPrivate::stop() { - if(deviceState == QAudio::StopState) + if(deviceState == QAudio::StoppedState) return; - deviceState = QAudio::StopState; + deviceState = QAudio::StoppedState; close(); emit stateChanged(deviceState); } @@ -281,9 +282,31 @@ bool QAudioOutputPrivate::open() unsigned int freakuency=settings.frequency(); QString dev = QLatin1String(m_device.constData()); - if(!dev.contains(QLatin1String("default"))) { - dev = QString(QLatin1String("default:CARD=%1")).arg(QLatin1String(m_device.constData())); + QList<QByteArray> devices = QAudioDeviceInfoInternal::availableDevices(QAudio::AudioOutput); + if(dev.compare(QLatin1String("default")) == 0) { +#if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) + dev = QLatin1String(devices.first().constData()); +#else + dev = QLatin1String("hw:0,0"); +#endif + } else { +#if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) + dev = QLatin1String(m_device); +#else + int idx = 0; + char *name; + + QString shortName = QLatin1String(m_device.mid(m_device.indexOf('=',0)+1).constData()); + + while(snd_card_get_name(idx,&name) == 0) { + if(qstrncmp(shortName.toLocal8Bit().constData(),name,shortName.length()) == 0) + break; + idx++; + } + dev = QString(QLatin1String("hw:%1,0")).arg(idx); +#endif } + // Step 1: try and open the device while((count < 5) && (err < 0)) { err=snd_pcm_open(&handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_PLAYBACK,0); @@ -292,7 +315,7 @@ bool QAudioOutputPrivate::open() } if (( err < 0)||(handle == 0)) { errorState = QAudio::OpenError; - deviceState = QAudio::StopState; + deviceState = QAudio::StoppedState; return false; } snd_pcm_nonblock( handle, 0 ); @@ -375,7 +398,7 @@ bool QAudioOutputPrivate::open() if( err < 0) { qWarning()<<errMessage; errorState = QAudio::OpenError; - deviceState = QAudio::StopState; + deviceState = QAudio::StoppedState; return false; } snd_pcm_hw_params_get_buffer_size(hwparams,&buffer_frames); @@ -407,6 +430,7 @@ bool QAudioOutputPrivate::open() // Step 6: Start audio processing timer->start(period_time/1000); + clockStamp.restart(); timeStamp.restart(); elapsedTimeOffset = 0; errorState = QAudio::NoError; @@ -418,7 +442,7 @@ bool QAudioOutputPrivate::open() void QAudioOutputPrivate::close() { - deviceState = QAudio::StopState; + deviceState = QAudio::StoppedState; timer->stop(); if ( handle ) { @@ -481,7 +505,7 @@ qint64 QAudioOutputPrivate::write( const char *data, qint64 len ) if(err < 0) { close(); errorState = QAudio::FatalError; - deviceState = QAudio::StopState; + deviceState = QAudio::StoppedState; emit stateChanged(deviceState); } return 0; @@ -494,7 +518,7 @@ int QAudioOutputPrivate::periodSize() const void QAudioOutputPrivate::setBufferSize(int value) { - if(deviceState == QAudio::StopState) + if(deviceState == QAudio::StoppedState) buffer_size = value; } @@ -516,14 +540,14 @@ int QAudioOutputPrivate::notifyInterval() const return intervalTime; } -qint64 QAudioOutputPrivate::totalTime() const +qint64 QAudioOutputPrivate::processedUSecs() const { return totalTimeValue; } void QAudioOutputPrivate::resume() { - if(deviceState == QAudio::SuspendState) { + if(deviceState == QAudio::SuspendedState) { int err = 0; if(handle) { @@ -558,7 +582,7 @@ void QAudioOutputPrivate::suspend() { if(deviceState == QAudio::ActiveState || deviceState == QAudio::IdleState || resuming) { timer->stop(); - deviceState = QAudio::SuspendState; + deviceState = QAudio::SuspendedState; errorState = QAudio::NoError; emit stateChanged(deviceState); } @@ -566,7 +590,7 @@ void QAudioOutputPrivate::suspend() void QAudioOutputPrivate::userFeed() { - if(deviceState == QAudio::StopState || deviceState == QAudio::SuspendState) + if(deviceState == QAudio::StoppedState || deviceState == QAudio::SuspendedState) return; #ifdef DEBUG_AUDIO QTime now(QTime::currentTime()); @@ -645,14 +669,15 @@ bool QAudioOutputPrivate::deviceReady() return true; } -qint64 QAudioOutputPrivate::clock() const +qint64 QAudioOutputPrivate::elapsedUSecs() const { if(!handle) return 0; - if (deviceState == QAudio::StopState) + if (deviceState == QAudio::StoppedState) return 0; +#if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) snd_pcm_status_t* status; snd_pcm_status_alloca(&status); @@ -668,9 +693,12 @@ qint64 QAudioOutputPrivate::clock() const l = -l; l %= 1000000; } - return ((t1.tv_sec * 1000)+l/1000); + return ((t1.tv_sec * 1000000)+l); } else return 0; +#else + return clockStamp.elapsed()*1000; +#endif return 0; } |