summaryrefslogtreecommitdiffstats
path: root/src/app
diff options
context:
space:
mode:
authormio <[email protected]>2024-09-07 08:56:14 +1000
committermio <[email protected]>2024-09-07 10:27:39 +1000
commitf464b0384ba3bc70e79523d079c4a1ec16ae7868 (patch)
treea0069361ec685f73b220cc9806d916b47f8845bc /src/app
parent11c0638baf9ae1623fec00107bb9d065d3ecb88b (diff)
downloadcodeine-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.cpp74
-rw-r--r--src/app/xineEngine.h4
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();