diff options
author | nplourde <nplourde@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2005-06-29 18:17:19 +0000 |
---|---|---|
committer | nplourde <nplourde@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2005-06-29 18:17:19 +0000 |
commit | 0bbc7905c97b77b6c7676fdea305c99080521d81 (patch) | |
tree | aa5f8956dc717eb7646f2878bc61793a82b63f55 /libao2 | |
parent | 8215f4f4ae2d08e43382ddfb353a61f2135df255 (diff) | |
download | mpv-0bbc7905c97b77b6c7676fdea305c99080521d81.tar.bz2 mpv-0bbc7905c97b77b6c7676fdea305c99080521d81.tar.xz |
more general ao_macosx cleanup. Patch by Alexander Strange <astrange@ithinksw.com>
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@15854 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libao2')
-rw-r--r-- | libao2/ao_macosx.c | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/libao2/ao_macosx.c b/libao2/ao_macosx.c index a621ccdb46..b51040bee2 100644 --- a/libao2/ao_macosx.c +++ b/libao2/ao_macosx.c @@ -81,7 +81,6 @@ typedef struct ao_macosx_s * (num_chunks + 1) * chunk_size memory to store num_chunks * chunk_size * data */ unsigned char *buffer; - unsigned char *chunk; unsigned int buffer_len; ///< must always be (num_chunks + 1) * chunk_size unsigned int num_chunks; unsigned int chunk_size; @@ -90,7 +89,7 @@ typedef struct ao_macosx_s unsigned int buf_write_pos; } ao_macosx_t; -static ao_macosx_t *ao; +static ao_macosx_t *ao = NULL; /** * \brief return number of free bytes in the buffer @@ -159,15 +158,12 @@ OSStatus theRenderProc(void *inRefCon, AudioUnitRenderActionFlags *inActionFlags int amt=buf_used(); int req=(inNumFrames)*ao->packetSize; - - ioData->mBuffers[0].mData = ao->chunk; - if(amt>req) amt=req; if(amt) read_buffer((unsigned char *)ioData->mBuffers[0].mData, amt); - + else audio_pause(); ioData->mBuffers[0].mDataByteSize = amt; return noErr; @@ -179,7 +175,6 @@ static int control(int cmd,void *arg){ case AOCONTROL_GET_DEVICE: case AOCONTROL_GET_VOLUME: case AOCONTROL_SET_VOLUME: - case AOCONTROL_QUERY_FORMAT: /* Everything is currently unimplemented */ return CONTROL_FALSE; default: @@ -224,8 +219,9 @@ Component comp; AURenderCallbackStruct renderCallback; OSStatus err; UInt32 size, maxFrames; +int aoIsCreated = ao != NULL; - ao = (ao_macosx_t *)malloc(sizeof(ao_macosx_t)); + if (!aoIsCreated) ao = (ao_macosx_t *)malloc(sizeof(ao_macosx_t)); // Build Description for the input format memset(&inDesc, 0, sizeof(AudioStreamBasicDescription)); @@ -271,11 +267,7 @@ UInt32 size, maxFrames; ao->packetSize = inDesc.mBytesPerPacket = inDesc.mBytesPerFrame = inDesc.mFramesPerPacket*channels*(inDesc.mBitsPerChannel/8); print_format("source: ",&inDesc); - ao_data.samplerate = inDesc.mSampleRate; - ao_data.channels = inDesc.mChannelsPerFrame; - ao_data.outburst = ao_data.buffersize = ao->chunk_size; - ao_data.bps = ao_data.samplerate * inDesc.mBytesPerFrame; - + if (!aoIsCreated) { desc.componentType = kAudioUnitType_Output; desc.componentSubType = kAudioUnitSubType_DefaultOutput; desc.componentManufacturer = kAudioUnitManufacturer_Apple; @@ -300,6 +292,7 @@ UInt32 size, maxFrames; ao_msg(MSGT_AO, MSGL_WARN, "Unable to initialize Output Unit component (err=%d)\n", err); return CONTROL_FALSE; } + } size = sizeof(AudioStreamBasicDescription); err = AudioUnitSetProperty(ao->theOutputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &inDesc, size); @@ -323,8 +316,13 @@ UInt32 size, maxFrames; ao->chunk_size = maxFrames*inDesc.mBytesPerFrame; ao->num_chunks = NUM_BUFS; ao->buffer_len = (ao->num_chunks + 1) * ao->chunk_size; - ao->buffer = (unsigned char *)calloc(ao->num_chunks + 1, ao->chunk_size); - ao->chunk = (unsigned char*)calloc(1, ao->chunk_size); + ao->buffer = aoIsCreated ? (unsigned char *)realloc(ao->buffer,(ao->num_chunks + 1)*ao->chunk_size) + : (unsigned char *)calloc(ao->num_chunks + 1, ao->chunk_size); + + ao_data.samplerate = inDesc.mSampleRate; + ao_data.channels = inDesc.mChannelsPerFrame; + ao_data.outburst = ao_data.buffersize = ao->chunk_size; + ao_data.bps = ao_data.samplerate * inDesc.mBytesPerFrame; memset(&renderCallback, 0, sizeof(AURenderCallbackStruct)); renderCallback.inputProc = theRenderProc; @@ -335,7 +333,9 @@ UInt32 size, maxFrames; return CONTROL_FALSE; } - reset(); + audio_pause(); + ao->buf_read_pos=0; + ao->buf_write_pos=0; return CONTROL_OK; } @@ -343,6 +343,7 @@ UInt32 size, maxFrames; static int play(void* output_samples,int num_bytes,int flags) { + audio_resume(); return write_buffer(output_samples, num_bytes); } @@ -387,9 +388,9 @@ static void uninit(int immed) AudioUnitUninitialize(ao->theOutputUnit); CloseComponent(ao->theOutputUnit); - free(ao->chunk); free(ao->buffer); free(ao); + ao = NULL; } |