1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-05 21:57:41 +02:00

Fix startup volume for good

This commit is contained in:
Dominik Schmidt
2016-02-22 00:10:17 +01:00
parent f74c6ae429
commit 86cd7c1be0
8 changed files with 92 additions and 7 deletions

BIN
data/sounds/silence.ogg Normal file

Binary file not shown.

View File

@@ -170,5 +170,6 @@
<file>data/images/downloadbutton.svg</file> <file>data/images/downloadbutton.svg</file>
<file>data/images/nav-back.svg</file> <file>data/images/nav-back.svg</file>
<file>data/images/nav-forward.svg</file> <file>data/images/nav-forward.svg</file>
<file>data/sounds/silence.ogg</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@@ -167,6 +167,7 @@ AudioEngine::AudioEngine()
d->audioOutput = new AudioOutput( this ); d->audioOutput = new AudioOutput( this );
connect( d->audioOutput, SIGNAL( initialized() ), this, SIGNAL( initialized() ) );
connect( d->audioOutput, SIGNAL( stateChanged( AudioOutput::AudioState, AudioOutput::AudioState ) ), d_func(), SLOT( onStateChanged( AudioOutput::AudioState, AudioOutput::AudioState ) ) ); connect( d->audioOutput, SIGNAL( stateChanged( AudioOutput::AudioState, AudioOutput::AudioState ) ), d_func(), SLOT( onStateChanged( AudioOutput::AudioState, AudioOutput::AudioState ) ) );
connect( d->audioOutput, SIGNAL( tick( qint64 ) ), SLOT( timerTriggered( qint64 ) ) ); connect( d->audioOutput, SIGNAL( tick( qint64 ) ), SLOT( timerTriggered( qint64 ) ) );
connect( d->audioOutput, SIGNAL( positionChanged( float ) ), SLOT( onPositionChanged( float ) ) ); connect( d->audioOutput, SIGNAL( positionChanged( float ) ), SLOT( onPositionChanged( float ) ) );
@@ -289,8 +290,11 @@ AudioEngine::stop( AudioErrorCode errorCode )
if ( d->waitingOnNewTrack ) if ( d->waitingOnNewTrack )
sendWaitingNotification(); sendWaitingNotification();
Tomahawk::InfoSystem::InfoPushData pushData( s_aeInfoIdentifier, Tomahawk::InfoSystem::InfoNowStopped, QVariant(), Tomahawk::InfoSystem::PushNoFlag ); if ( d->audioOutput->isInitialized() )
Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo( pushData ); {
Tomahawk::InfoSystem::InfoPushData pushData( s_aeInfoIdentifier, Tomahawk::InfoSystem::InfoNowStopped, QVariant(), Tomahawk::InfoSystem::PushNoFlag );
Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo( pushData );
}
} }
@@ -566,6 +570,12 @@ AudioEngine::loadTrack( const Tomahawk::result_ptr& result )
Q_D( AudioEngine ); Q_D( AudioEngine );
tDebug( LOGEXTRA ) << Q_FUNC_INFO << ( result.isNull() ? QString() : result->url() ); tDebug( LOGEXTRA ) << Q_FUNC_INFO << ( result.isNull() ? QString() : result->url() );
if ( !d->audioOutput->isInitialized() )
{
return;
}
if ( !result ) if ( !result )
{ {
stop(); stop();

View File

@@ -149,6 +149,8 @@ public slots:
void setShuffled( bool enabled ); void setShuffled( bool enabled );
signals: signals:
void initialized();
void loading( const Tomahawk::result_ptr track ); void loading( const Tomahawk::result_ptr track );
void started( const Tomahawk::result_ptr track ); void started( const Tomahawk::result_ptr track );
void finished( const Tomahawk::result_ptr track ); void finished( const Tomahawk::result_ptr track );

View File

@@ -25,11 +25,13 @@
#include "audio/MediaStream.h" #include "audio/MediaStream.h"
#include "utils/Logger.h" #include "utils/Logger.h"
#include "utils/TomahawkUtils.h"
#include <QApplication> #include <QApplication>
#include <QVarLengthArray> #include <QVarLengthArray>
#include <QFile> #include <QFile>
#include <QDir> #include <QDir>
#include <QTimer>
#include <vlc/libvlc.h> #include <vlc/libvlc.h>
#include <vlc/libvlc_media.h> #include <vlc/libvlc_media.h>
@@ -58,6 +60,7 @@ AudioOutput::AudioOutput( QObject* parent )
, m_currentTime( 0 ) , m_currentTime( 0 )
, m_totalTime( 0 ) , m_totalTime( 0 )
, m_justSeeked( false ) , m_justSeeked( false )
, m_initialized( false )
, dspPluginCallback( nullptr ) , dspPluginCallback( nullptr )
, m_vlcInstance( nullptr ) , m_vlcInstance( nullptr )
, m_vlcPlayer( nullptr ) , m_vlcPlayer( nullptr )
@@ -129,7 +132,28 @@ AudioOutput::AudioOutput( QObject* parent )
} }
m_muted = isMuted(); m_muted = isMuted();
tDebug() << Q_FUNC_INFO << "Init OK";
// HACK: play silent ogg file and set volume on that to workaround vlc not allowing to set volume before a file is played
libvlc_media_player_set_media( m_vlcPlayer, m_vlcMedia );
libvlc_media_player_play( m_vlcPlayer );
m_silenceFile.setFileName( RESPATH "sounds/silence.ogg" );
Q_ASSERT( m_silenceFile.exists() );
Q_ASSERT( m_silenceFile.open( QIODevice::ReadOnly ) );
setCurrentSource( new MediaStream( &m_silenceFile, true ) );
libvlc_media_player_play( m_vlcPlayer );
#if QT_VERSION >= QT_VERSION_CHECK(5,4,0)
// if the silence file did not play for 15 secs, we pretend the AudioOutput is initialized, to allow proper error reporting
QTimer::singleShot( 15000, [&]()
{
if ( !m_initialized ) {
m_initialized = true;
emit initialized();
}
} );
#endif
} }
@@ -155,6 +179,27 @@ AudioOutput::~AudioOutput()
} }
void
AudioOutput::onInitVlcEvent( const libvlc_event_t* event )
{
switch ( event->type )
{
case libvlc_MediaPlayerTimeChanged:
setVolume( volume() );
m_initialized = true;
m_silenceFile.close();
tDebug() << Q_FUNC_INFO << "Init OK";
emit initialized();
break;
default:
break;
}
}
void void
AudioOutput::setAutoDelete( bool ad ) AudioOutput::setAutoDelete( bool ad )
{ {
@@ -303,6 +348,13 @@ AudioOutput::setCurrentSource( MediaStream* stream )
} }
bool
AudioOutput::isInitialized() const
{
return m_initialized;
}
AudioOutput::AudioState AudioOutput::AudioState
AudioOutput::state() const AudioOutput::state() const
{ {
@@ -555,7 +607,14 @@ AudioOutput::vlcEventCallback( const libvlc_event_t* event, void* opaque )
AudioOutput* that = reinterpret_cast < AudioOutput * > ( opaque ); AudioOutput* that = reinterpret_cast < AudioOutput * > ( opaque );
Q_ASSERT( that ); Q_ASSERT( that );
that->onVlcEvent( event ); if ( !that->isInitialized() )
{
that->onInitVlcEvent( event );
}
else
{
that->onVlcEvent( event );
}
} }

View File

@@ -25,6 +25,8 @@
#include "DllMacro.h" #include "DllMacro.h"
#include "Typedefs.h" #include "Typedefs.h"
#include <QFile>
#include <functional> #include <functional>
struct libvlc_instance_t; struct libvlc_instance_t;
@@ -44,6 +46,7 @@ public:
explicit AudioOutput( QObject* parent = nullptr ); explicit AudioOutput( QObject* parent = nullptr );
~AudioOutput(); ~AudioOutput();
bool isInitialized() const;
AudioState state() const; AudioState state() const;
void setCurrentSource( const QUrl& stream ); void setCurrentSource( const QUrl& stream );
@@ -72,11 +75,14 @@ public:
public slots: public slots:
signals: signals:
void initialized();
void stateChanged( AudioOutput::AudioState, AudioOutput::AudioState ); void stateChanged( AudioOutput::AudioState, AudioOutput::AudioState );
void tick( qint64 ); void tick( qint64 );
void positionChanged( float ); void positionChanged( float );
private: private:
void onInitVlcEvent( const libvlc_event_t* event );
void setState( AudioState state ); void setState( AudioState state );
void setCurrentTime( qint64 time ); void setCurrentTime( qint64 time );
void setCurrentPosition( float position ); void setCurrentPosition( float position );
@@ -99,6 +105,9 @@ private:
qint64 m_totalTime; qint64 m_totalTime;
bool m_justSeeked; bool m_justSeeked;
bool m_initialized;
QFile m_silenceFile;
std::function< void( int state, int frameNumber, float* samples, int nb_channels, int nb_samples ) > dspPluginCallback; std::function< void( int state, int frameNumber, float* samples, int nb_channels, int nb_samples ) > dspPluginCallback;
libvlc_instance_t* m_vlcInstance; libvlc_instance_t* m_vlcInstance;

View File

@@ -41,12 +41,16 @@ MediaStream::MediaStream( const QUrl &url )
} }
MediaStream::MediaStream( QIODevice* device ) MediaStream::MediaStream( QIODevice* device, bool bufferingFinished )
: QObject( nullptr ) : QObject( nullptr )
, m_type( IODevice ) , m_type( IODevice )
, m_ioDevice ( device ) , m_ioDevice ( device )
, m_bufferingFinished( bufferingFinished )
{ {
QObject::connect( m_ioDevice, SIGNAL( readChannelFinished() ), this, SLOT( bufferingFinished() ) ); if ( !bufferingFinished )
{
QObject::connect( m_ioDevice, SIGNAL( readChannelFinished() ), this, SLOT( bufferingFinished() ) );
}
} }

View File

@@ -42,7 +42,7 @@ public:
MediaStream( QObject* parent = nullptr ); MediaStream( QObject* parent = nullptr );
explicit MediaStream( const QUrl &url ); explicit MediaStream( const QUrl &url );
explicit MediaStream( QIODevice* device ); explicit MediaStream( QIODevice* device, bool bufferingFinished = false );
virtual ~MediaStream(); virtual ~MediaStream();
MediaType type() const; MediaType type() const;