From 9bb7a06256dd3fc1682b43c3d3cfb383adf8961f Mon Sep 17 00:00:00 2001 From: dridri Date: Sun, 28 Sep 2014 13:36:32 +0200 Subject: [PATCH] Added DSP callback support for VLC phonon --- src/libtomahawk/audio/AudioEngine.cpp | 53 ++++++++------------------- src/libtomahawk/audio/AudioEngine.h | 7 ++-- src/libtomahawk/audio/AudioEngine_p.h | 4 +- 3 files changed, 20 insertions(+), 44 deletions(-) diff --git a/src/libtomahawk/audio/AudioEngine.cpp b/src/libtomahawk/audio/AudioEngine.cpp index c844229cc..64e9d220e 100644 --- a/src/libtomahawk/audio/AudioEngine.cpp +++ b/src/libtomahawk/audio/AudioEngine.cpp @@ -215,6 +215,7 @@ AudioEngine::AudioEngine() d->state = Stopped; d->coverTempFile = 0; d->audioEffect = 0; + d->dspPluginCallback = 0; d->s_instance = this; tDebug() << "Init AudioEngine"; @@ -236,7 +237,7 @@ AudioEngine::AudioEngine() onVolumeChanged( d->audioOutput->volume() ); setVolume( TomahawkSettings::instance()->volume() ); - initEqualizer(); + d->mediaObject->setCurrentSource(Phonon::MediaSource("PhononDSP::effectCallback=" + QString::number((qulonglong)&AudioEngine::dspCallback, 16))); } @@ -1384,52 +1385,28 @@ AudioEngine::setCurrentTrackPlaylist( const playlistinterface_ptr& playlist ) void -AudioEngine::initEqualizer() +AudioEngine::dspCallback( signed short* samples, int nb_channels, int nb_samples ) +{ + AudioEngine::instance()->dspCallbackInternal( samples, nb_channels, nb_samples ); +} + + +void +AudioEngine::dspCallbackInternal( signed short* samples, int nb_channels, int nb_samples ) { Q_D( AudioEngine ); - QList< Phonon::EffectDescription > effectDescriptions = Phonon::BackendCapabilities::availableAudioEffects(); - foreach ( Phonon::EffectDescription effectDesc, effectDescriptions ) + if ( d->dspPluginCallback != 0 ) { - if ( effectDesc.name().toLower().contains( "eq" ) ) - { - d->audioEffect = new Phonon::Effect( effectDesc ); - d->audioPath.insertEffect( d->audioEffect ); - break; - } + d->dspPluginCallback( samples, nb_channels, nb_samples ); } } -int -AudioEngine::equalizerBandCount() +void +AudioEngine::setDspCallback( void ( *cb ) ( signed short*, int, int ) ) { Q_D( AudioEngine ); - if ( d->audioEffect ) - { - QList< Phonon::EffectParameter > params = d->audioEffect->parameters(); - return params.size(); - } - - return 0; -} - - -bool -AudioEngine::setEqualizerBand( int band, int value ) -{ - Q_D( AudioEngine ); - - if ( d->audioEffect ) - { - QList< Phonon::EffectParameter > params = d->audioEffect->parameters(); - if ( band < params.size() ) - { - d->audioEffect->setParameterValue( params.at( band ), value ); - return true; - } - } - - return false; + d->dspPluginCallback = cb; } diff --git a/src/libtomahawk/audio/AudioEngine.h b/src/libtomahawk/audio/AudioEngine.h index 25a0c5c07..db9ca1884 100644 --- a/src/libtomahawk/audio/AudioEngine.h +++ b/src/libtomahawk/audio/AudioEngine.h @@ -109,8 +109,7 @@ public: */ qint64 currentTrackTotalTime() const; - int equalizerBandCount(); - bool setEqualizerBand( int band, int value ); + void setDspCallback( void ( *cb ) ( signed short* samples, int nb_channels, int nb_samples ) ); public slots: void playPause(); @@ -200,9 +199,9 @@ private slots: private: void setState( AudioState state ); void setCurrentTrackPlaylist( const Tomahawk::playlistinterface_ptr& playlist ); - void initEqualizer(); - void initEqualizer(); + static void dspCallback( signed short* samples, int nb_channels, int nb_samples ); + void dspCallbackInternal( signed short* samples, int nb_channels, int nb_samples ); void audioDataArrived( QMap< AudioEngine::AudioChannel, QVector< qint16 > >& data ); diff --git a/src/libtomahawk/audio/AudioEngine_p.h b/src/libtomahawk/audio/AudioEngine_p.h index be87094fa..b03338634 100644 --- a/src/libtomahawk/audio/AudioEngine_p.h +++ b/src/libtomahawk/audio/AudioEngine_p.h @@ -43,8 +43,6 @@ private: Phonon::MediaObject* mediaObject; Phonon::AudioOutput* audioOutput; - Phonon::Path audioPath; - Phonon::Effect* audioEffect; Phonon::Path audioPath; Phonon::Effect* audioEffect; @@ -68,5 +66,7 @@ private: QTemporaryFile* coverTempFile; + void (* dspPluginCallback )( signed short* samples, int nb_channels, int nb_samples ); + static AudioEngine* s_instance; };