diff options
author | mio <[email protected]> | 2024-09-07 08:56:14 +1000 |
---|---|---|
committer | mio <[email protected]> | 2024-09-07 10:27:39 +1000 |
commit | f464b0384ba3bc70e79523d079c4a1ec16ae7868 (patch) | |
tree | a0069361ec685f73b220cc9806d916b47f8845bc /src/app | |
parent | 11c0638baf9ae1623fec00107bb9d065d3ecb88b (diff) | |
download | codeine-fix/use-audio-level.tar.gz codeine-fix/use-audio-level.zip |
Use AUDIO_VOLUME param instead of AUDIO_AMP_LEVELfix/use-audio-level
AMP_LEVEL adjusts the amplification level of VOLUME, and since it's
called "volume" in the UI, this is more appropriate. This also avoids
the need to use logarithmic scaling when adjusting the volume from the
UI, as VOLUME is linear.
When compared with libxine versions older than 1.2.13, there is no
notable difference in how the volume sounds when adjusted. From 1.2.13,
the sound does scale a little differently as lower volumes are more
audible now (such as 50% and lower).
Signed-off-by: mio <[email protected]>
Diffstat (limited to 'src/app')
-rw-r--r-- | src/app/xineEngine.cpp | 74 | ||||
-rw-r--r-- | src/app/xineEngine.h | 4 |
2 files changed, 30 insertions, 48 deletions
diff --git a/src/app/xineEngine.cpp b/src/app/xineEngine.cpp index 3ae7220..441ab3d 100644 --- a/src/app/xineEngine.cpp +++ b/src/app/xineEngine.cpp @@ -26,7 +26,6 @@ namespace Codeine { VideoWindow *VideoWindow::s_instance = nullptr; -bool VideoWindow::s_logarithmicVolume = false; VideoWindow::VideoWindow( TQWidget *parent ) @@ -54,13 +53,6 @@ VideoWindow::VideoWindow( TQWidget *parent ) //TODO sucks //TODO namespace this? myList->next = myList; //init the buffer list - - // Detect xine version, this is used for volume adjustment. - // Xine versions prior to 1.2.13 use linear volume, so the engine uses logarithmic volume. - // Xine versions starting from 1.2.13 use logarithmic volume, so the engine uses linear volume. - int xinemajor = 0, xineminor = 0, xinemaint = 0; - xine_get_version(&xinemajor, &xineminor, &xinemaint); - s_logarithmicVolume = (xinemajor * 1000000 + xineminor * 1000 + xinemaint < 1002013); } VideoWindow::~VideoWindow() @@ -70,31 +62,37 @@ VideoWindow::~VideoWindow() eject(); // fade out volume on exit - if( m_stream && xine_get_status( m_stream ) == XINE_STATUS_PLAY ) { + const int volBeforeFade = xine_get_param(m_stream, XINE_PARAM_AUDIO_VOLUME); + if (m_stream && xine_get_status(m_stream) == XINE_STATUS_PLAY) + { int cum = 0; - for( int v = 99; v >= 0; v-- ) { - int vol = v; - if (s_logarithmicVolume) - { - vol = makeVolumeLogarithmic(vol); - } - xine_set_param( m_stream, XINE_PARAM_AUDIO_AMP_LEVEL, vol ); - int sleep = int(32000 * (-std::log10( double(v + 1) ) + 2)); + int vol = volBeforeFade; - ::usleep( sleep ); + while (vol > 0) + { + vol -= 1; + xine_set_param(m_stream, XINE_PARAM_AUDIO_VOLUME, vol); + int sleep = int(32000 * (-std::log10(vol + 1.0) + 2)); + + ::usleep(sleep); cum += sleep; } debug() << "Total sleep: " << cum << "x10^-6 s\n"; - xine_stop( m_stream ); + xine_stop(m_stream); - ::sleep( 1 ); + ::sleep(1); } //xine_set_param( m_stream, XINE_PARAM_IGNORE_VIDEO, 1 ); + // Xine (or the audio driver) seems to remember the volume level, + // even when xine's audio.volume.remember_volume is set to false. + // FIXME: The VolumeSlider doesn't reflect this initial volume! + xine_set_param(m_stream, XINE_PARAM_AUDIO_VOLUME, volBeforeFade); + if( m_osd ) xine_osd_free( m_osd ); if( m_stream ) xine_close( m_stream ); if( m_eventQueue ) xine_event_dispose_queue( m_eventQueue ); @@ -268,8 +266,7 @@ VideoWindow::load( const KURL &url ) setParameter( XINE_PARAM_SPU_CHANNEL, -1 ); setParameter( XINE_PARAM_AUDIO_CHANNEL_LOGICAL, -1 ); setParameter( XINE_PARAM_VO_ASPECT_RATIO, 0 ); - // 100 is the same for both linear and logarithmic volume control - setParameter( XINE_PARAM_AUDIO_AMP_LEVEL, 100 ); + setParameter( XINE_PARAM_AUDIO_VOLUME, 100 ); #undef setParameter videoWindow()->setShown( xine_get_stream_info( m_stream, XINE_STREAM_INFO_HAS_VIDEO ) ); @@ -456,14 +453,10 @@ VideoWindow::posTimeLength( PosTimeLength type ) const return 0; //--warning } -uint +int VideoWindow::volume() const { - int vol = xine_get_param( m_stream, XINE_PARAM_AUDIO_AMP_LEVEL ); - if (s_logarithmicVolume) - { - vol = 100 - 100.0 * (pow(10, (100.0 - vol) / 100.0) - 1) / 9.0; - } + int vol = xine_get_param(m_stream, XINE_PARAM_AUDIO_VOLUME); if (vol < 0) { vol = 0; @@ -472,7 +465,7 @@ VideoWindow::volume() const { vol = 100; } - return (uint)vol; + return vol; } void @@ -505,7 +498,7 @@ VideoWindow::seek( uint pos ) // xine_play unpauses stream if stream was paused // was broken at 1.0.1 still wasPaused = true; - xine_set_param( m_stream, XINE_PARAM_AUDIO_AMP_MUTE, 1 ); + xine_set_param( m_stream, XINE_PARAM_AUDIO_MUTE, 1 ); break; default: ; @@ -553,16 +546,11 @@ VideoWindow::seek( uint pos ) //after xine_play because the hide command uses stream position xine_osd_hide( m_osd, xine_get_current_vpts( m_stream ) + 180000 ); //2 seconds - if( wasPaused ) - xine_set_param( m_stream, XINE_PARAM_SPEED, XINE_SPEED_PAUSE ), - xine_set_param( m_stream, XINE_PARAM_AUDIO_AMP_MUTE, 0 ); -} - -int -VideoWindow::makeVolumeLogarithmic(int volume) -{ - // We're using a logarithmic function to make the volume ramp more natural. - return static_cast<uint>( 100 - 100.0 * std::log10( ( 100 - volume ) * 0.09 + 1.0 ) ); + if (wasPaused) + { + xine_set_param( m_stream, XINE_PARAM_SPEED, XINE_SPEED_PAUSE ); + xine_set_param( m_stream, XINE_PARAM_AUDIO_MUTE, 0 ); + } } void @@ -589,12 +577,8 @@ VideoWindow::setStreamParameter( int value ) parameter = XINE_PARAM_VO_ASPECT_RATIO; else if( sender == "volume" ) { - parameter = XINE_PARAM_AUDIO_AMP_LEVEL; + parameter = XINE_PARAM_AUDIO_VOLUME; value = 100 - value; // TQt sliders are wrong way round when vertical - if (s_logarithmicVolume) - { - value = makeVolumeLogarithmic(value); - } } else return; diff --git a/src/app/xineEngine.h b/src/app/xineEngine.h index d152a96..318f7ff 100644 --- a/src/app/xineEngine.h +++ b/src/app/xineEngine.h @@ -39,7 +39,6 @@ namespace Codeine enum PosTimeLength { Pos, Time, Length }; static VideoWindow *s_instance; - static bool s_logarithmicVolume; VideoWindow( const VideoWindow& ); //disable VideoWindow &operator=( const VideoWindow& ); //disable @@ -62,7 +61,7 @@ namespace Codeine uint time() const { return posTimeLength( Time ); } uint length() const { return posTimeLength( Length ); } - uint volume() const; + int volume() const; const Engine::Scope &scope(); Engine::State state() const; @@ -121,7 +120,6 @@ namespace Codeine private: static void destSizeCallBack( void*, int, int, double, int*, int*, double* ); static void frameOutputCallBack( void*, int, int, double, int*, int*, int*, int*, double*, int*, int* ); - static int makeVolumeLogarithmic(int volume); void initVideo(); void cleanUpVideo(); |