From 16cd94eb812a2e79777a96e108abc5db525b70de Mon Sep 17 00:00:00 2001 From: ulion Date: Tue, 4 Dec 2007 12:38:31 +0000 Subject: Add cleanup codes for init() failure to prevent leak. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@25293 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libao2/ao_macosx.c | 81 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 61 insertions(+), 20 deletions(-) (limited to 'libao2') diff --git a/libao2/ao_macosx.c b/libao2/ao_macosx.c index 9b73c36be0..0a47b77473 100644 --- a/libao2/ao_macosx.c +++ b/libao2/ao_macosx.c @@ -325,7 +325,7 @@ int b_alive; if (err != noErr) { ao_msg(MSGT_AO, MSGL_WARN, "could not get default audio device: [%4.4s]\n", (char *)&err); - return CONTROL_FALSE; + goto err_out; } /* Retrieve the length of the device name. */ @@ -336,7 +336,7 @@ int b_alive; if (err != noErr) { ao_msg(MSGT_AO, MSGL_WARN, "could not get default audio device name length: [%4.4s]\n", (char *)&err); - return CONTROL_FALSE; + goto err_out; } /* Retrieve the name of the device. */ @@ -347,7 +347,8 @@ int b_alive; if (err != noErr) { ao_msg(MSGT_AO, MSGL_WARN, "could not get default audio device name: [%4.4s]\n", (char *)&err); - return CONTROL_FALSE; + free( psz_name); + goto err_out; } ao_msg(MSGT_AO,MSGL_V, "got default audio output device ID: %#lx Name: %s\n", devid_def, psz_name ); @@ -381,8 +382,7 @@ int b_alive; break; default: ao_msg(MSGT_AO, MSGL_WARN, "Unsupported format (0x%08x)\n", format); - return CONTROL_FALSE; - break; + goto err_out; } if((format&AF_FORMAT_POINT_MASK)==AF_FORMAT_F) { @@ -438,7 +438,7 @@ int b_alive; if (ao->i_hog_pid != -1 && ao->i_hog_pid != getpid()) { ao_msg(MSGT_AO, MSGL_WARN, "Selected audio device is exclusively in use by another program.\n" ); - return CONTROL_FALSE; + goto err_out; } ao->stream_format = inDesc; return OpenSPDIF(); @@ -454,20 +454,20 @@ int b_alive; comp = FindNextComponent(NULL, &desc); //Finds an component that meets the desc spec's if (comp == NULL) { ao_msg(MSGT_AO, MSGL_WARN, "Unable to find Output Unit component\n"); - return CONTROL_FALSE; + goto err_out; } err = OpenAComponent(comp, &(ao->theOutputUnit)); //gains access to the services provided by the component if (err) { ao_msg(MSGT_AO, MSGL_WARN, "Unable to open Output Unit component: [%4.4s]\n", (char *)&err); - return CONTROL_FALSE; + goto err_out; } // Initialize AudioUnit err = AudioUnitInitialize(ao->theOutputUnit); if (err) { ao_msg(MSGT_AO, MSGL_WARN, "Unable to initialize Output Unit component: [%4.4s]\n", (char *)&err); - return CONTROL_FALSE; + goto err_out1; } size = sizeof(AudioStreamBasicDescription); @@ -475,7 +475,7 @@ int b_alive; if (err) { ao_msg(MSGT_AO, MSGL_WARN, "Unable to set the input format: [%4.4s]\n", (char *)&err); - return CONTROL_FALSE; + goto err_out2; } size = sizeof(UInt32); @@ -484,7 +484,7 @@ int b_alive; if (err) { ao_msg(MSGT_AO,MSGL_WARN, "AudioUnitGetProperty returned [%4.4s] when getting kAudioDevicePropertyBufferSize\n", (char *)&err); - return CONTROL_FALSE; + goto err_out2; } ao->chunk_size = maxFrames;//*inDesc.mBytesPerFrame; @@ -507,12 +507,22 @@ int b_alive; err = AudioUnitSetProperty(ao->theOutputUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &renderCallback, sizeof(AURenderCallbackStruct)); if (err) { ao_msg(MSGT_AO, MSGL_WARN, "Unable to set the render callback: [%4.4s]\n", (char *)&err); - return CONTROL_FALSE; + goto err_out2; } reset(); return CONTROL_OK; + +err_out2: + AudioUnitUninitialize(ao->theOutputUnit); +err_out1: + CloseComponent(ao->theOutputUnit); +err_out: + free(ao->buffer); + free(ao); + ao = NULL; + return CONTROL_FALSE; } /***************************************************************************** @@ -539,7 +549,8 @@ static int OpenSPDIF() if (err != noErr) { ao_msg(MSGT_AO, MSGL_WARN, "failed to set hogmode: [%4.4s]\n", (char *)&err); - return CONTROL_FALSE; + ao->i_hog_pid = -1; + goto err_out; } /* Set mixable to false if we are allowed to. */ @@ -560,7 +571,7 @@ static int OpenSPDIF() if (err != noErr) { ao_msg(MSGT_AO, MSGL_WARN, "failed to set mixmode: [%4.4s]\n", (char *)&err); - return CONTROL_FALSE; + goto err_out; } /* Get a list of all the streams on this device. */ @@ -570,7 +581,7 @@ static int OpenSPDIF() if (err != noErr) { ao_msg(MSGT_AO, MSGL_WARN, "could not get number of streams: [%4.4s]\n", (char *)&err); - return CONTROL_FALSE; + goto err_out; } i_streams = i_param_size / sizeof(AudioStreamID); @@ -578,7 +589,7 @@ static int OpenSPDIF() if (p_streams == NULL) { ao_msg(MSGT_AO, MSGL_WARN, "out of memory\n" ); - return CONTROL_FALSE; + goto err_out; } err = AudioDeviceGetProperty(ao->i_selected_dev, 0, FALSE, @@ -588,7 +599,7 @@ static int OpenSPDIF() { ao_msg(MSGT_AO, MSGL_WARN, "could not get number of streams: [%4.4s]\n", (char *)&err); if (p_streams) free(p_streams); - return CONTROL_FALSE; + goto err_out; } ao_msg(MSGT_AO, MSGL_V, "current device stream number: %d\n", i_streams); @@ -693,13 +704,13 @@ static int OpenSPDIF() if (ao->i_stream_index < 0) { ao_msg(MSGT_AO, MSGL_WARN, "can not find any digital output stream format when OpenSPDIF().\n"); - return CONTROL_FALSE; + goto err_out; } print_format(MSGL_V, "original stream format:", &ao->sfmt_revert); if (!AudioStreamChangeFormat(ao->i_stream_id, ao->stream_format)) - return CONTROL_FALSE; + goto err_out; err = AudioDeviceAddPropertyListener(ao->i_selected_dev, kAudioPropertyWildcardChannel, @@ -744,12 +755,42 @@ static int OpenSPDIF() if (err != noErr) { ao_msg(MSGT_AO, MSGL_WARN, "AudioDeviceAddIOProc failed: [%4.4s]\n", (char *)&err); - return CONTROL_FALSE; + goto err_out1; } reset(); return CONTROL_TRUE; + +err_out1: + if (ao->b_revert) + AudioStreamChangeFormat(ao->i_stream_id, ao->sfmt_revert); +err_out: + if (ao->b_changed_mixing && ao->sfmt_revert.mFormatID != kAudioFormat60958AC3) + { + int b_mix = 1; + err = AudioDeviceSetProperty(ao->i_selected_dev, 0, 0, FALSE, + kAudioDevicePropertySupportsMixing, + i_param_size, &b_mix); + if (err != noErr) + ao_msg(MSGT_AO, MSGL_WARN, "failed to set mixmode: [%4.4s]\n", + (char *)&err); + } + if (ao->i_hog_pid == getpid()) + { + ao->i_hog_pid = -1; + i_param_size = sizeof(ao->i_hog_pid); + err = AudioDeviceSetProperty(ao->i_selected_dev, 0, 0, FALSE, + kAudioDevicePropertyHogMode, + i_param_size, &ao->i_hog_pid); + if (err != noErr) + ao_msg(MSGT_AO, MSGL_WARN, "Could not release hogmode: [%4.4s]\n", + (char *)&err); + } + free(ao->buffer); + free(ao); + ao = NULL; + return CONTROL_FALSE; } /***************************************************************************** -- cgit v1.2.3