Commit 3ca21ff4 authored by Derk-Jan Hartman's avatar Derk-Jan Hartman

* Fix for stream selection on HAL devices.

  by Jean Alexis Montignies <ja at sente.ch>
parent c24e6c9c
...@@ -40,6 +40,7 @@ Fumio Nakayama <endymion@ca2.so-net.ne.jp> - Japanese translation ...@@ -40,6 +40,7 @@ Fumio Nakayama <endymion@ca2.so-net.ne.jp> - Japanese translation
Goetz Waschk <waschk at informatik.uni-rostock dot de> - Mandrake packages Goetz Waschk <waschk at informatik.uni-rostock dot de> - Mandrake packages
Haakon Meland Eriksen - Norwegian translation Haakon Meland Eriksen - Norwegian translation
Hans-Peter Jansen <hpj@urpla.net> - patch for module options handling Hans-Peter Jansen <hpj@urpla.net> - patch for module options handling
Jean-Alexis Montignies <ja@sente.ch> - coreaudio multiple streams fix
Jean-Philippe Grimaldi <jeanphi@via.ecp.fr> - bug fixes Jean-Philippe Grimaldi <jeanphi@via.ecp.fr> - bug fixes
Jean-Pierre Kuypers <Kuypers@sri.ucl.ac.be> - French translation Jean-Pierre Kuypers <Kuypers@sri.ucl.ac.be> - French translation
Jeffrey Baker <jwbaker@acm.org> - port of the ALSA plugin to the ALSA 1.0 API Jeffrey Baker <jwbaker@acm.org> - port of the ALSA plugin to the ALSA 1.0 API
......
/***************************************************************************** /*****************************************************************************
* coreaudio.c: CoreAudio output plugin * coreaudio.c: CoreAudio output plugin
***************************************************************************** *****************************************************************************
* Copyright (C) 2002-2003 VideoLAN * Copyright (C) 2002-2004 VideoLAN
* $Id: coreaudio.c,v 1.10 2004/01/25 18:53:07 gbazin Exp $ * $Id$
* *
* 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>
...@@ -157,6 +157,7 @@ struct aout_sys_t ...@@ -157,6 +157,7 @@ struct aout_sys_t
struct aout_option_t * p_options; struct aout_option_t * p_options;
AudioDeviceID devid; AudioDeviceID devid;
UInt32 i_stream_index;
AudioStreamBasicDescription stream_format; AudioStreamBasicDescription stream_format;
UInt32 b_dev_alive; UInt32 b_dev_alive;
...@@ -236,6 +237,8 @@ static int Open( vlc_object_t * p_this ) ...@@ -236,6 +237,8 @@ static int Open( vlc_object_t * p_this )
UInt32 i_param_size; UInt32 i_param_size;
struct aout_sys_t * p_sys; struct aout_sys_t * p_sys;
aout_instance_t * p_aout = (aout_instance_t *)p_this; aout_instance_t * p_aout = (aout_instance_t *)p_this;
struct aout_option_t * p_option;
UInt32 i_startingChannel;
/* Allocate structure */ /* Allocate structure */
p_sys = (struct aout_sys_t *)malloc( sizeof( struct aout_sys_t ) ); p_sys = (struct aout_sys_t *)malloc( sizeof( struct aout_sys_t ) );
...@@ -275,9 +278,29 @@ static int Open( vlc_object_t * p_this ) ...@@ -275,9 +278,29 @@ static int Open( vlc_object_t * p_this )
return( VLC_EGENERIC ); return( VLC_EGENERIC );
} }
/* get starting channel for the selected stream */
p_option = &p_sys->p_options[p_sys->i_sel_opt];
i_param_size = sizeof( UInt32 );
err = AudioStreamGetProperty( p_option->i_sid, 0,
kAudioStreamPropertyStartingChannel,
&i_param_size, &i_startingChannel );
if( err != noErr )
{
msg_Err( p_aout, "failed to get channel number: [%4.4s]",
(char *)&err );
FreeDevice( p_aout );
FreeHardwareInfo( p_aout );
vlc_mutex_destroy( &p_sys->lock );
free( (void *)p_sys );
return( VLC_EGENERIC );
}
msg_Dbg( p_aout, "starting channel: [%ld]", i_startingChannel );
/* Get a description of the stream format */ /* Get a description of the stream format */
i_param_size = sizeof( AudioStreamBasicDescription ); i_param_size = sizeof( AudioStreamBasicDescription );
err = AudioDeviceGetProperty( p_sys->devid, 0, FALSE, err = AudioDeviceGetProperty( p_sys->devid, i_startingChannel, FALSE,
kAudioDevicePropertyStreamFormat, kAudioDevicePropertyStreamFormat,
&i_param_size, &p_sys->stream_format ); &i_param_size, &p_sys->stream_format );
if( err != noErr ) if( err != noErr )
...@@ -300,7 +323,7 @@ static int Open( vlc_object_t * p_this ) ...@@ -300,7 +323,7 @@ static int Open( vlc_object_t * p_this )
/* Get the buffer size */ /* Get the buffer size */
i_param_size = sizeof( p_sys->i_buffer_size ); i_param_size = sizeof( p_sys->i_buffer_size );
err = AudioDeviceGetProperty( p_sys->devid, 0, FALSE, err = AudioDeviceGetProperty( p_sys->devid, i_startingChannel, FALSE,
kAudioDevicePropertyBufferSize, kAudioDevicePropertyBufferSize,
&i_param_size, &p_sys->i_buffer_size ); &i_param_size, &p_sys->i_buffer_size );
if( err != noErr ) if( err != noErr )
...@@ -315,7 +338,8 @@ static int Open( vlc_object_t * p_this ) ...@@ -315,7 +338,8 @@ static int Open( vlc_object_t * p_this )
} }
msg_Dbg( p_aout, "device buffer size: [%ld]", p_sys->i_buffer_size ); msg_Dbg( p_aout, "device buffer size: [%ld]", p_sys->i_buffer_size );
msg_Dbg( p_aout, "device buffer index: [%ld]", p_sys->i_stream_index );
/* If we do AC3 over SPDIF, set buffer size to one AC3 frame */ /* If we do AC3 over SPDIF, set buffer size to one AC3 frame */
if( ( p_sys->stream_format.mFormatID == kAudioFormat60958AC3 || if( ( p_sys->stream_format.mFormatID == kAudioFormat60958AC3 ||
p_sys->stream_format.mFormatID == 'IAC3' ) && p_sys->stream_format.mFormatID == 'IAC3' ) &&
...@@ -605,7 +629,7 @@ static OSStatus IOCallback( AudioDeviceID inDevice, ...@@ -605,7 +629,7 @@ static OSStatus IOCallback( AudioDeviceID inDevice,
if( p_buffer != NULL ) if( p_buffer != NULL )
{ {
/* move data into output data buffer */ /* move data into output data buffer */
p_aout->p_vlc->pf_memcpy( outOutputData->mBuffers[ 0 ].mData, p_aout->p_vlc->pf_memcpy( outOutputData->mBuffers[ p_sys->i_stream_index ].mData,
p_buffer->p_buffer, p_buffer->p_buffer,
p_sys->i_buffer_size ); p_sys->i_buffer_size );
...@@ -616,7 +640,7 @@ static OSStatus IOCallback( AudioDeviceID inDevice, ...@@ -616,7 +640,7 @@ static OSStatus IOCallback( AudioDeviceID inDevice,
if( p_aout->output.output.i_format == VLC_FOURCC('f','l','3','2') ) if( p_aout->output.output.i_format == VLC_FOURCC('f','l','3','2') )
{ {
UInt32 i, i_size = p_sys->i_buffer_size / sizeof(float); UInt32 i, i_size = p_sys->i_buffer_size / sizeof(float);
float * p = (float *)outOutputData->mBuffers[ 0 ].mData; float * p = (float *)outOutputData->mBuffers[ p_sys->i_stream_index ].mData;
for( i = 0; i < i_size; i++ ) for( i = 0; i < i_size; i++ )
{ {
...@@ -625,7 +649,7 @@ static OSStatus IOCallback( AudioDeviceID inDevice, ...@@ -625,7 +649,7 @@ static OSStatus IOCallback( AudioDeviceID inDevice,
} }
else else
{ {
memset( outOutputData->mBuffers[ 0 ].mData, memset( outOutputData->mBuffers[ p_sys->i_stream_index ].mData,
0, p_sys->i_buffer_size ); 0, p_sys->i_buffer_size );
} }
} }
...@@ -1116,7 +1140,7 @@ static int InitDevice( aout_instance_t * p_aout ) ...@@ -1116,7 +1140,7 @@ static int InitDevice( aout_instance_t * p_aout )
vlc_value_t val; vlc_value_t val;
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, i_firstChannelNum;
struct aout_dev_t * p_dev; struct aout_dev_t * p_dev;
struct aout_option_t * p_option; struct aout_option_t * p_option;
...@@ -1163,6 +1187,13 @@ static int InitDevice( aout_instance_t * p_aout ) ...@@ -1163,6 +1187,13 @@ 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_firstChannelNum = 0;
for( i = 0; i < i_stream; i++ )
{
i_firstChannelNum += P_STREAMS[i].mChannelsPerFrame;
}
i_param_size = sizeof( p_sys->sfmt_revert ); i_param_size = sizeof( p_sys->sfmt_revert );
err = AudioStreamGetProperty( p_option->i_sid, 0, err = AudioStreamGetProperty( p_option->i_sid, 0,
kAudioStreamPropertyPhysicalFormat, kAudioStreamPropertyPhysicalFormat,
...@@ -1254,8 +1285,6 @@ static int InitDevice( aout_instance_t * p_aout ) ...@@ -1254,8 +1285,6 @@ static int InitDevice( aout_instance_t * p_aout )
p_sys->b_revert_sfmt = VLC_TRUE; p_sys->b_revert_sfmt = VLC_TRUE;
} }
#undef I_STREAMS
#undef P_STREAMS
err = AudioDeviceAddPropertyListener( p_dev->devid, 0, FALSE, err = AudioDeviceAddPropertyListener( p_dev->devid, 0, FALSE,
kAudioDevicePropertyDeviceIsAlive, kAudioDevicePropertyDeviceIsAlive,
...@@ -1271,6 +1300,9 @@ static int InitDevice( aout_instance_t * p_aout ) ...@@ -1271,6 +1300,9 @@ static int InitDevice( aout_instance_t * p_aout )
p_sys->i_sel_opt = i_option; p_sys->i_sel_opt = i_option;
p_sys->devid = p_dev->devid; p_sys->devid = p_dev->devid;
p_sys->i_stream_index = p_option->i_idx;
#undef I_STREAMS
#undef P_STREAMS
return( VLC_SUCCESS ); return( VLC_SUCCESS );
} }
......
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