Commit 92db27a9 authored by Jon Lech Johansen's avatar Jon Lech Johansen

Jeff Moore @ Apple: The HAL specifically won't allow a device that doesn't

                    have linear PCM as it's current format to be
                    the default device.
parent 7a1e7c01
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* aout.m: CoreAudio output plugin * aout.m: CoreAudio output plugin
***************************************************************************** *****************************************************************************
* Copyright (C) 2002-2003 VideoLAN * Copyright (C) 2002-2003 VideoLAN
* $Id: aout.m,v 1.26 2003/03/14 01:08:38 jlj Exp $ * $Id: aout.m,v 1.27 2003/03/15 19:21:49 jlj Exp $
* *
* Authors: Colin Delacroix <colin@zoy.org> * Authors: Colin Delacroix <colin@zoy.org>
* Jon Lech Johansen <jon-vl@nanocrew.net> * Jon Lech Johansen <jon-vl@nanocrew.net>
...@@ -162,6 +162,9 @@ struct aout_sys_t ...@@ -162,6 +162,9 @@ struct aout_sys_t
AudioStreamBasicDescription stream_format; AudioStreamBasicDescription stream_format;
UInt32 b_dev_alive; UInt32 b_dev_alive;
vlc_bool_t b_revert_sfmt;
AudioStreamBasicDescription sfmt_revert;
UInt32 i_buffer_size; UInt32 i_buffer_size;
mtime_t clock_diff; mtime_t clock_diff;
}; };
...@@ -1090,7 +1093,6 @@ static int InitDevice( aout_instance_t * p_aout ) ...@@ -1090,7 +1093,6 @@ static int InitDevice( aout_instance_t * p_aout )
unsigned int i_option; unsigned int i_option;
vlc_bool_t b_found = VLC_FALSE; vlc_bool_t b_found = VLC_FALSE;
UInt32 i, i_stream, i_param_size; UInt32 i, i_stream, i_param_size;
AudioStreamBasicDescription desc;
struct aout_dev_t * p_dev; struct aout_dev_t * p_dev;
struct aout_option_t * p_option; struct aout_option_t * p_option;
...@@ -1144,11 +1146,11 @@ static int InitDevice( aout_instance_t * p_aout ) ...@@ -1144,11 +1146,11 @@ static int InitDevice( aout_instance_t * p_aout )
i_stream = b_found ? i : p_option->i_sdx; i_stream = b_found ? i : p_option->i_sdx;
i_param_size = sizeof( desc ); i_param_size = sizeof( p_sys->sfmt_revert );
memset( &desc, 0, i_param_size );
err = AudioStreamGetProperty( p_option->i_sid, 0, err = AudioStreamGetProperty( p_option->i_sid, 0,
kAudioStreamPropertyPhysicalFormat, kAudioStreamPropertyPhysicalFormat,
&i_param_size, (void *)&desc ); &i_param_size,
(void *)&p_sys->sfmt_revert );
if( err != noErr ) if( err != noErr )
{ {
msg_Err( p_aout, "AudioStreamGetPropertyInfo failed: [%4.4s]", msg_Err( p_aout, "AudioStreamGetPropertyInfo failed: [%4.4s]",
...@@ -1156,13 +1158,17 @@ static int InitDevice( aout_instance_t * p_aout ) ...@@ -1156,13 +1158,17 @@ static int InitDevice( aout_instance_t * p_aout )
return( VLC_EGENERIC ); return( VLC_EGENERIC );
} }
if( memcmp( &P_STREAMS[i_stream], &desc, sizeof( desc ) ) != 0 ) if( memcmp( &P_STREAMS[i_stream], &p_sys->sfmt_revert,
sizeof( p_sys->sfmt_revert ) ) != 0 )
{ {
struct { vlc_mutex_t lock; vlc_cond_t cond; } w; struct { vlc_mutex_t lock; vlc_cond_t cond; } w;
vlc_cond_init( p_aout, &w.cond ); vlc_cond_init( p_aout, &w.cond );
vlc_mutex_init( p_aout, &w.lock ); vlc_mutex_init( p_aout, &w.lock );
msg_Dbg( p_aout, STREAM_FORMAT_MSG( "stream format",
p_sys->sfmt_revert ) );
err = AudioStreamAddPropertyListener( p_option->i_sid, 0, err = AudioStreamAddPropertyListener( p_option->i_sid, 0,
kAudioStreamPropertyPhysicalFormat, kAudioStreamPropertyPhysicalFormat,
StreamListener, (void *)&w ); StreamListener, (void *)&w );
...@@ -1218,6 +1224,8 @@ static int InitDevice( aout_instance_t * p_aout ) ...@@ -1218,6 +1224,8 @@ static int InitDevice( aout_instance_t * p_aout )
return( VLC_EGENERIC ); return( VLC_EGENERIC );
} }
p_sys->b_revert_sfmt = VLC_TRUE;
} }
#undef I_STREAMS #undef I_STREAMS
...@@ -1250,6 +1258,37 @@ static void FreeDevice( aout_instance_t * p_aout ) ...@@ -1250,6 +1258,37 @@ static void FreeDevice( aout_instance_t * p_aout )
struct aout_sys_t * p_sys = p_aout->output.p_sys; struct aout_sys_t * p_sys = p_aout->output.p_sys;
if( p_sys->b_revert_sfmt )
{
struct aout_dev_t * p_dev;
struct aout_option_t * p_option;
p_option = &p_sys->p_options[p_sys->i_sel_opt];
p_dev = &p_sys->p_devices[p_option->i_dev];
msg_Dbg( p_aout, STREAM_FORMAT_MSG( "reverting to format",
p_sys->sfmt_revert ) );
if( GetStreamID( p_dev->devid, p_option->i_idx + 1,
&p_option->i_sid ) )
{
msg_Err( p_aout, "GetStreamID(%ld, %ld) failed",
p_option->i_dev, p_option->i_idx );
}
else
{
err = AudioStreamSetProperty( p_option->i_sid, 0, 0,
kAudioStreamPropertyPhysicalFormat,
sizeof( p_sys->sfmt_revert ),
&p_sys->sfmt_revert );
if( err != noErr )
{
msg_Err( p_aout, "AudioStreamSetProperty failed: [%4.4s]",
(char *)&err );
}
}
}
err = AudioDeviceRemovePropertyListener( p_sys->devid, 0, FALSE, err = AudioDeviceRemovePropertyListener( p_sys->devid, 0, FALSE,
kAudioDevicePropertyDeviceIsAlive, kAudioDevicePropertyDeviceIsAlive,
DeviceListener ); DeviceListener );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment