Commit 8345dff5 authored by Jon Lech Johansen's avatar Jon Lech Johansen

* ./modules/gui/macosx/aout.m: M-Audio Revolution fixes.

                                 Dynamic device support.
  * ./modules/gui/macosx: Minor fixes and cosmetic changes.
parent 36401a1c
......@@ -39,7 +39,7 @@
ACTIONS = {showCategory = id; toggleInfoPanel = id; };
CLASS = VLCInfo;
LANGUAGE = ObjC;
OUTLETS = {"o_info_selector" = id; "o_info_view" = id; "o_info_window" = id; };
OUTLETS = {"o_selector" = id; "o_view" = id; "o_window" = id; };
SUPERCLASS = NSObject;
},
{
......
......@@ -3,11 +3,11 @@
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>65 171 365 441 0 0 1280 1002 </string>
<string>417 347 365 441 0 0 1600 1178 </string>
<key>IBEditorPositions</key>
<dict>
<key>29</key>
<string>16 822 419 44 0 0 1280 1002 </string>
<string>22 973 419 44 0 0 1600 1178 </string>
<key>303</key>
<string>60 509 104 114 0 0 1280 1002 </string>
<key>909</key>
......@@ -23,8 +23,9 @@
</array>
<key>IBOpenObjects</key>
<array>
<integer>29</integer>
<integer>1194</integer>
<integer>21</integer>
<integer>29</integer>
</array>
<key>IBSystem Version</key>
<string>6I32</string>
......
......@@ -2,7 +2,7 @@
* aout.m: CoreAudio output plugin
*****************************************************************************
* Copyright (C) 2002-2003 VideoLAN
* $Id: aout.m,v 1.23 2003/02/21 16:31:37 hartman Exp $
* $Id: aout.m,v 1.24 2003/02/23 05:53:53 jlj Exp $
*
* Authors: Colin Delacroix <colin@zoy.org>
* Jon Lech Johansen <jon-vl@nanocrew.net>
......@@ -56,7 +56,8 @@ enum AudioDeviceClass
AudioDeviceClassA52 = 1 << 0,
AudioDeviceClassPCM2 = 1 << 1,
AudioDeviceClassPCM4 = 1 << 2,
AudioDeviceClassPCM6 = 1 << 3
AudioDeviceClassPCM6 = 1 << 3,
AudioDeviceClassPCM8 = 1 << 4
};
static struct aout_class_t
......@@ -64,20 +65,20 @@ static struct aout_class_t
UInt32 mFormatID;
UInt32 mChannelsPerFrame;
enum AudioDeviceClass class;
const char *psz_class;
const char * psz_class;
}
aout_classes[] =
{
{ /* old A/52 format type */
'IAC3',
0,
2,
AudioDeviceClassA52,
"Digital A/52"
},
{ /* new A/52 format type */
kAudioFormat60958AC3,
0,
2,
AudioDeviceClassA52,
"Digital A/52"
},
......@@ -101,6 +102,13 @@ aout_classes[] =
6,
AudioDeviceClassPCM6,
"6 Channel PCM"
},
{
kAudioFormatLinearPCM,
8,
AudioDeviceClassPCM8,
"8 Channel PCM"
}
};
......@@ -123,8 +131,9 @@ struct aout_option_t
struct aout_dev_t
{
AudioDeviceID devid;
char *psz_device_name;
char * psz_device_name;
UInt32 i_streams;
UInt32 * pi_streams;
AudioStreamBasicDescription ** pp_streams;
};
......@@ -136,13 +145,18 @@ struct aout_dev_t
*****************************************************************************/
struct aout_sys_t
{
vlc_mutex_t lock;
vlc_bool_t b_hwinfo;
UInt32 i_def_dev;
UInt32 i_devices;
struct aout_dev_t * p_devices;
UInt32 i_sel_opt;
UInt32 i_options;
struct aout_option_t * p_options;
struct aout_option_t * p_options;
AudioDeviceID devid;
AudioStreamBasicDescription stream_format;
UInt32 b_dev_alive;
UInt32 i_buffer_size;
mtime_t clock_diff;
......@@ -151,28 +165,44 @@ struct aout_sys_t
/*****************************************************************************
* Local prototypes.
*****************************************************************************/
static int InitHardware ( aout_instance_t *p_aout );
static int InitDevice ( UInt32 i_dev, aout_instance_t *p_aout );
static void FreeDevice ( UInt32 i_dev, aout_instance_t *p_aout );
static void FreeHardware ( aout_instance_t *p_aout );
static int GetDevice ( aout_instance_t *p_aout,
AudioDeviceID *p_devid );
static int GetStreamID ( AudioDeviceID devid, UInt32 i_idx,
AudioStreamID * p_sid );
static int InitStream ( UInt32 i_dev, aout_instance_t *p_aout,
UInt32 i_idx );
static void FreeStream ( UInt32 i_dev, aout_instance_t *p_aout,
UInt32 i_idx );
static void Play ( aout_instance_t *p_aout );
static OSStatus IOCallback ( AudioDeviceID inDevice,
const AudioTimeStamp *inNow,
const void *inInputData,
const AudioTimeStamp *inInputTime,
AudioBufferList *outOutputData,
const AudioTimeStamp *inOutputTime,
void *threadGlobals );
static int InitHardwareInfo ( aout_instance_t * p_aout );
static int InitDeviceInfo ( UInt32 i_dev, aout_instance_t * p_aout );
static void FreeDeviceInfo ( UInt32 i_dev, aout_instance_t * p_aout );
static void FreeHardwareInfo ( aout_instance_t * p_aout );
static int InitDevice ( aout_instance_t * p_aout );
static void FreeDevice ( aout_instance_t * p_aout );
static int GetStreamID ( AudioDeviceID devid, UInt32 i_idx,
AudioStreamID * p_sid );
static int InitStreamInfo ( UInt32 i_dev, aout_instance_t * p_aout,
UInt32 i_idx );
static void FreeStreamInfo ( UInt32 i_dev, aout_instance_t * p_aout,
UInt32 i_idx );
static void InitDeviceVar ( aout_instance_t * p_aout, int i_option,
vlc_bool_t b_change );
static void Play ( aout_instance_t * p_aout );
static OSStatus IOCallback ( AudioDeviceID inDevice,
const AudioTimeStamp * inNow,
const void * inInputData,
const AudioTimeStamp * inInputTime,
AudioBufferList * outOutputData,
const AudioTimeStamp * inOutputTime,
void * threadGlobals );
static OSStatus HardwareListener ( AudioHardwarePropertyID inPropertyID,
void * inClientData );
static OSStatus DeviceListener ( AudioDeviceID inDevice,
UInt32 inChannel,
Boolean isInput,
AudioDevicePropertyID inPropertyID,
void * inClientData );
static OSStatus StreamListener ( AudioStreamID inStream,
UInt32 inChannel,
AudioDevicePropertyID inPropertyID,
void * inClientData );
/*****************************************************************************
* Open: open a CoreAudio HAL device
......@@ -180,8 +210,7 @@ static OSStatus IOCallback ( AudioDeviceID inDevice,
int E_(OpenAudio)( vlc_object_t * p_this )
{
OSStatus err;
vlc_value_t val;
UInt32 i, i_param_size;
UInt32 i_param_size;
struct aout_sys_t * p_sys;
aout_instance_t * p_aout = (aout_instance_t *)p_this;
......@@ -194,62 +223,47 @@ int E_(OpenAudio)( vlc_object_t * p_this )
}
memset( p_sys, 0, sizeof( struct aout_sys_t ) );
p_aout->output.p_sys = p_sys;
p_aout->output.pf_play = Play;
if( InitHardware( p_aout ) )
vlc_mutex_init( p_aout, &p_sys->lock );
if( InitHardwareInfo( p_aout ) )
{
msg_Err( p_aout, "InitHardware failed" );
msg_Err( p_aout, "InitHardwareInfo failed" );
vlc_mutex_destroy( &p_sys->lock );
free( (void *)p_sys );
return( VLC_EGENERIC );
}
if( var_Type( p_aout, "audio-device" ) == 0 )
{
UInt32 i_option = config_GetInt( p_aout, "macosx-adev" );
var_Create( p_aout, "audio-device", VLC_VAR_STRING |
VLC_VAR_HASCHOICE );
for( i = 0; i < p_sys->i_options; i++ )
{
val.psz_string = p_sys->p_options[i].sz_option;
var_Change( p_aout, "audio-device", VLC_VAR_ADDCHOICE, &val );
if( i == i_option )
{
var_Set( p_aout, "audio-device", val );
}
}
var_AddCallback( p_aout, "audio-device", aout_ChannelsRestart,
NULL );
val.b_bool = VLC_TRUE;
var_Set( p_aout, "intf-change", val );
InitDeviceVar( p_aout, config_GetInt( p_aout, "macosx-adev" ),
VLC_FALSE );
}
/* Get requested device */
if( GetDevice( p_aout, &p_sys->devid ) )
if( InitDevice( p_aout ) )
{
msg_Err( p_aout, "GetDevice failed" );
FreeHardware( p_aout );
msg_Err( p_aout, "InitDevice failed" );
FreeHardwareInfo( p_aout );
vlc_mutex_destroy( &p_sys->lock );
free( (void *)p_sys );
return( VLC_EGENERIC );
}
p_aout->output.pf_play = Play;
aout_VolumeSoftInit( p_aout );
/* Get a description of the stream format */
i_param_size = sizeof( AudioStreamBasicDescription );
err = AudioDeviceGetProperty( p_sys->devid, 0, false,
err = AudioDeviceGetProperty( p_sys->devid, 0, FALSE,
kAudioDevicePropertyStreamFormat,
&i_param_size, &p_sys->stream_format );
if( err != noErr )
{
msg_Err( p_aout, "failed to get stream format: [%4.4s]",
(char *)&err );
FreeHardware( p_aout );
FreeDevice( p_aout );
FreeHardwareInfo( p_aout );
vlc_mutex_destroy( &p_sys->lock );
free( (void *)p_sys );
return( VLC_EGENERIC );
}
......@@ -263,14 +277,16 @@ int E_(OpenAudio)( vlc_object_t * p_this )
/* Get the buffer size */
i_param_size = sizeof( p_sys->i_buffer_size );
err = AudioDeviceGetProperty( p_sys->devid, 0, false,
err = AudioDeviceGetProperty( p_sys->devid, 0, FALSE,
kAudioDevicePropertyBufferSize,
&i_param_size, &p_sys->i_buffer_size );
if( err != noErr )
{
msg_Err( p_aout, "failed to get buffer size: [%4.4s]",
(char *)&err );
FreeHardware( p_aout );
FreeDevice( p_aout );
FreeHardwareInfo( p_aout );
vlc_mutex_destroy( &p_sys->lock );
free( (void *)p_sys );
return( VLC_EGENERIC );
}
......@@ -284,14 +300,16 @@ int E_(OpenAudio)( vlc_object_t * p_this )
{
p_sys->i_buffer_size = AOUT_SPDIF_SIZE;
i_param_size = sizeof( p_sys->i_buffer_size );
err = AudioDeviceSetProperty( p_sys->devid, 0, 0, false,
err = AudioDeviceSetProperty( p_sys->devid, 0, 0, FALSE,
kAudioDevicePropertyBufferSize,
i_param_size, &p_sys->i_buffer_size );
if( err != noErr )
{
msg_Err( p_aout, "failed to set buffer size: [%4.4s]",
(char *)&err );
FreeHardware( p_aout );
FreeDevice( p_aout );
FreeHardwareInfo( p_aout );
vlc_mutex_destroy( &p_sys->lock );
free( (void *)p_sys );
return( VLC_EGENERIC );
}
......@@ -305,27 +323,48 @@ int E_(OpenAudio)( vlc_object_t * p_this )
case kAudioFormatLinearPCM:
p_aout->output.output.i_format = VLC_FOURCC('f','l','3','2');
if( p_sys->stream_format.mChannelsPerFrame == 6 )
switch( p_sys->stream_format.mChannelsPerFrame )
{
case 2:
p_aout->output.output.i_physical_channels =
AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
AOUT_CHAN_CENTER | AOUT_CHAN_REARRIGHT |
AOUT_CHAN_REARLEFT | AOUT_CHAN_LFE;
}
else if( p_sys->stream_format.mChannelsPerFrame == 4 )
{
AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
break;
case 4:
p_aout->output.output.i_physical_channels =
AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT;
}
else
{
break;
case 6:
p_aout->output.output.i_physical_channels =
AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT |
AOUT_CHAN_CENTER | AOUT_CHAN_LFE;
break;
case 8:
p_aout->output.output.i_physical_channels =
AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT |
AOUT_CHAN_CENTER | AOUT_CHAN_LFE |
AOUT_CHAN_MIDDLELEFT | AOUT_CHAN_MIDDLERIGHT;
break;
default:
msg_Err( p_aout, "unknown channel count: [%ld]",
p_sys->stream_format.mChannelsPerFrame );
FreeDevice( p_aout );
FreeHardwareInfo( p_aout );
vlc_mutex_destroy( &p_sys->lock );
free( (void *)p_sys );
return( VLC_EGENERIC );
}
p_aout->output.i_nb_samples = (int)( p_sys->i_buffer_size /
p_sys->stream_format.mBytesPerFrame );
aout_VolumeSoftInit( p_aout );
break;
case 'IAC3':
......@@ -334,19 +373,23 @@ int E_(OpenAudio)( vlc_object_t * p_this )
p_aout->output.output.i_bytes_per_frame = AOUT_SPDIF_SIZE;
p_aout->output.output.i_frame_length = A52_FRAME_NB;
p_aout->output.i_nb_samples = p_aout->output.output.i_frame_length;
aout_VolumeNoneInit( p_aout );
break;
default:
msg_Err( p_aout, "unknown hardware format: [%4.4s]",
(char *)&p_sys->stream_format.mFormatID );
FreeHardware( p_aout );
FreeDevice( p_aout );
FreeHardwareInfo( p_aout );
vlc_mutex_destroy( &p_sys->lock );
free( (void *)p_sys );
return( VLC_EGENERIC );
}
/* Set buffer frame size */
i_param_size = sizeof( p_aout->output.i_nb_samples );
err = AudioDeviceSetProperty( p_sys->devid, 0, 0, false,
err = AudioDeviceSetProperty( p_sys->devid, 0, 0, FALSE,
kAudioDevicePropertyBufferFrameSize,
i_param_size,
&p_aout->output.i_nb_samples );
......@@ -354,7 +397,9 @@ int E_(OpenAudio)( vlc_object_t * p_this )
{
msg_Err( p_aout, "failed to set buffer frame size: [%4.4s]",
(char *)&err );
FreeHardware( p_aout );
FreeDevice( p_aout );
FreeHardwareInfo( p_aout );
vlc_mutex_destroy( &p_sys->lock );
free( (void *)p_sys );
return( VLC_EGENERIC );
}
......@@ -370,7 +415,9 @@ int E_(OpenAudio)( vlc_object_t * p_this )
{
msg_Err( p_aout, "AudioDeviceAddIOProc failed: [%4.4s]",
(char *)&err );
FreeHardware( p_aout );
FreeDevice( p_aout );
FreeHardwareInfo( p_aout );
vlc_mutex_destroy( &p_sys->lock );
free( (void *)p_sys );
return( VLC_EGENERIC );
}
......@@ -381,8 +428,54 @@ int E_(OpenAudio)( vlc_object_t * p_this )
{
msg_Err( p_aout, "AudioDeviceStart failed: [%4.4s]",
(char *)&err );
FreeHardware( p_aout );
err = AudioDeviceRemoveIOProc( p_sys->devid,
(AudioDeviceIOProc)IOCallback );
if( err != noErr )
{
msg_Err( p_aout, "AudioDeviceRemoveIOProc failed: [%4.4s]",
(char *)&err );
}
FreeDevice( p_aout );
FreeHardwareInfo( p_aout );
vlc_mutex_destroy( &p_sys->lock );
free( (void *)p_sys );
return( VLC_EGENERIC );
}
err = AudioHardwareAddPropertyListener( kAudioHardwarePropertyDevices,
HardwareListener,
(void *)p_aout );
if( err != noErr )
{
msg_Err( p_aout, "AudioHardwareAddPropertyListener failed: %4.4s",
(char *)&err );
/* Stop device */
err = AudioDeviceStop( p_sys->devid,
(AudioDeviceIOProc)IOCallback );
if( err != noErr )
{
msg_Err( p_aout, "AudioDeviceStop failed: [%4.4s]",
(char *)&err );
}
/* Remove callback */
err = AudioDeviceRemoveIOProc( p_sys->devid,
(AudioDeviceIOProc)IOCallback );
if( err != noErr )
{
msg_Err( p_aout, "AudioDeviceRemoveIOProc failed: [%4.4s]",
(char *)&err );
}
FreeDevice( p_aout );
FreeHardwareInfo( p_aout );
vlc_mutex_destroy( &p_sys->lock );
free( (void *)p_sys );
return( VLC_EGENERIC );
}
......@@ -402,23 +495,40 @@ void E_(CloseAudio)( aout_instance_t * p_aout )
OSStatus err;
struct aout_sys_t * p_sys = p_aout->output.p_sys;
/* Stop device */
err = AudioDeviceStop( p_sys->devid, (AudioDeviceIOProc)IOCallback );
if( err != noErr )
if( p_sys->b_dev_alive )
{
msg_Err( p_aout, "AudioDeviceStop failed: [%4.4s]", (char *)&err );
/* Stop device */
err = AudioDeviceStop( p_sys->devid,
(AudioDeviceIOProc)IOCallback );
if( err != noErr )
{
msg_Err( p_aout, "AudioDeviceStop failed: [%4.4s]",
(char *)&err );
}
/* Remove callback */
err = AudioDeviceRemoveIOProc( p_sys->devid,
(AudioDeviceIOProc)IOCallback );
if( err != noErr )
{
msg_Err( p_aout, "AudioDeviceRemoveIOProc failed: [%4.4s]",
(char *)&err );
}
FreeDevice( p_aout );
}
/* Remove callback */
err = AudioDeviceRemoveIOProc( p_sys->devid,
(AudioDeviceIOProc)IOCallback );
err = AudioHardwareRemovePropertyListener( kAudioHardwarePropertyDevices,
HardwareListener );
if( err != noErr )
{
msg_Err( p_aout, "AudioDeviceRemoveIOProc failed: [%4.4s]",
msg_Err( p_aout, "AudioHardwareRemovePropertyListener failed: [%4.4s]",
(char *)&err );
}
FreeHardware( p_aout );
FreeHardwareInfo( p_aout );
vlc_mutex_destroy( &p_sys->lock );
free( p_sys );
}
......@@ -434,12 +544,12 @@ static void Play( aout_instance_t * p_aout )
* IOCallback: callback for audio output
*****************************************************************************/
static OSStatus IOCallback( AudioDeviceID inDevice,
const AudioTimeStamp *inNow,
const void *inInputData,
const AudioTimeStamp *inInputTime,
AudioBufferList *outOutputData,
const AudioTimeStamp *inOutputTime,
void *threadGlobals )
const AudioTimeStamp * inNow,
const void * inInputData,
const AudioTimeStamp * inInputTime,
AudioBufferList * outOutputData,
const AudioTimeStamp * inOutputTime,
void * threadGlobals )
{
aout_buffer_t * p_buffer;
AudioTimeStamp host_time;
......@@ -470,17 +580,18 @@ static OSStatus IOCallback( AudioDeviceID inDevice,
{
if( p_aout->output.output.i_format == VLC_FOURCC('f','l','3','2') )
{
int i;
int i_size = p_sys->i_buffer_size / sizeof(float);
float * a = (float *)outOutputData->mBuffers[ 0 ].mData;
for ( i = 0 ; i < i_size ; i++ )
*a++ = 0.0;
UInt32 i, i_size = p_sys->i_buffer_size / sizeof(float);
float * p = (float *)outOutputData->mBuffers[ 0 ].mData;
for( i = 0; i < i_size; i++ )
{
*p++ = 0.0;
}
}
else
{
memset( outOutputData->mBuffers[ 0 ].mData,
0, p_sys->i_buffer_size );
0, p_sys->i_buffer_size );
}
}
......@@ -488,16 +599,19 @@ static OSStatus IOCallback( AudioDeviceID inDevice,
}
/*****************************************************************************
* InitHardware
* InitHardwareInfo
*****************************************************************************/
static int InitHardware( aout_instance_t * p_aout )
static int InitHardwareInfo( aout_instance_t * p_aout )
{
OSStatus err;
UInt32 i, i_param_size;
AudioDeviceID devid_def;
AudioDeviceID * p_devices;
struct aout_sys_t * p_sys = p_aout->output.p_sys;
vlc_mutex_lock( &p_sys->lock );
/* Get number of devices */
err = AudioHardwareGetPropertyInfo( kAudioHardwarePropertyDevices,
&i_param_size, NULL );
......@@ -505,6 +619,7 @@ static int InitHardware( aout_instance_t * p_aout )
{
msg_Err( p_aout, "AudioHardwareGetPropertyInfo failed: [%4.4s]",
(char *)&err );
vlc_mutex_unlock( &p_sys->lock );
return( VLC_EGENERIC );
}
......@@ -513,6 +628,7 @@ static int InitHardware( aout_instance_t * p_aout )
if( p_sys->i_devices < 1 )
{
msg_Err( p_aout, "no devices found" );
vlc_mutex_unlock( &p_sys->lock );
return( VLC_EGENERIC );
}
......@@ -523,6 +639,7 @@ static int InitHardware( aout_instance_t * p_aout )
if( p_devices == NULL )
{
msg_Err( p_aout, "out of memory" );
vlc_mutex_unlock( &p_sys->lock );
return( VLC_ENOMEM );
}
......@@ -534,6 +651,19 @@ static int InitHardware( aout_instance_t * p_aout )
msg_Err( p_aout, "AudioHardwareGetProperty failed: [%4.4s]",
(char *)&err );
free( (void *)p_devices );
vlc_mutex_unlock( &p_sys->lock );
return( VLC_EGENERIC );
}
i_param_size = sizeof( AudioDeviceID );
err = AudioHardwareGetProperty( kAudioHardwarePropertyDefaultOutputDevice,
&i_param_size, (void *)&devid_def );
if( err != noErr )
{
msg_Err( p_aout, "AudioHardwareGetProperty failed: [%4.4s]",
(char *)&err );
free( (void *)p_devices );
vlc_mutex_unlock( &p_sys->lock );
return( VLC_EGENERIC );
}
......@@ -543,44 +673,59 @@ static int InitHardware( aout_instance_t * p_aout )
{
msg_Err( p_aout, "out of memory" );
free( (void *)p_devices );
vlc_mutex_unlock( &p_sys->lock );
return( VLC_ENOMEM );
}
p_sys->i_options = 0;
p_sys->p_options = NULL;
for( i = 0; i < p_sys->i_devices; i++ )
{
p_sys->p_devices[i].devid = p_devices[i];
if( InitDevice( i, p_aout ) )
if( p_devices[i] == devid_def )
{
p_sys->i_def_dev = i;
}
if( InitDeviceInfo( i, p_aout ) )
{
UInt32 j;
msg_Err( p_aout, "InitDevice(%ld) failed", i );
msg_Err( p_aout, "InitDeviceInfo(%ld) failed", i );
for( j = 0; j < i; j++ )
{
FreeDevice( j, p_aout );
FreeDeviceInfo( j, p_aout );
}
free( (void *)p_sys->p_devices );
free( (void *)p_devices );
vlc_mutex_unlock( &p_sys->lock );
return( VLC_EGENERIC );
}
}
free( (void *)p_devices );
p_sys->b_hwinfo = VLC_TRUE;
vlc_mutex_unlock( &p_sys->lock );
return( VLC_SUCCESS );
}
/*****************************************************************************
* InitDevice
* InitDeviceInfo
*****************************************************************************/
static int InitDevice( UInt32 i_dev, aout_instance_t * p_aout )
static int InitDeviceInfo( UInt32 i_dev, aout_instance_t * p_aout )
{
OSStatus err;
UInt32 i, i_param_size;
AudioBufferList *p_buffer_list;
AudioBufferList * p_buffer_list;
struct aout_sys_t * p_sys = p_aout->output.p_sys;
struct aout_dev_t * p_dev = &p_sys->p_devices[i_dev];
......@@ -656,6 +801,15 @@ static int InitDevice( UInt32 i_dev, aout_instance_t * p_aout )
msg_Dbg( p_aout, "device [%ld] has [%ld] streams",
i_dev, p_dev->i_streams );
p_dev->pi_streams = (UInt32 *)malloc( p_dev->i_streams *
sizeof( *p_dev->pi_streams ) );
if( p_dev->pi_streams == NULL )
{
msg_Err( p_aout, "out of memory" );
free( (void *)p_dev->psz_device_name );
return( VLC_ENOMEM );
}
p_dev->pp_streams = (AudioStreamBasicDescription **)
malloc( p_dev->i_streams *
sizeof( *p_dev->pp_streams ) );
......@@ -663,23 +817,25 @@ static int InitDevice( UInt32 i_dev, aout_instance_t * p_aout )
{
msg_Err( p_aout, "out of memory" );
free( (void *)p_dev->psz_device_name );
free( (void *)p_dev->pi_streams );
return( VLC_ENOMEM );
}