• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Static when playing back buffers
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Static when playing back buffers


  • Subject: Re: Static when playing back buffers
  • From: Kevin Dixon <email@hidden>
  • Date: Fri, 09 Nov 2012 16:42:45 -0800

If you are getting static, its probably because your buffers are uninitialized.
In my render callback, I always do a memset to zeros on the buffer
supplied in ioData. That way, even in the case of starvation, you just
play silence instead of noise.

Since you are getting two buffers, then it is probably one for each
channel (NON interleaved). If you put your data in one of them, but
not the other, then the right channel will be noise, and the left
channel your data.
If the data in TPCircularBuffer is interleaved, then you should hear
something between your playback rate cut in half (lower pitch,etc) and
noise, depending on the content.

If you need to de-interleave the data from TPCircularBuffer, you can
use a simple for loop like this

AudioSampleType * outL = (AudioSampleType*)ioData->mBuffers[0].mData;
AudioSampleType * outR = (AudioSampleType*)ioData->mBuffers[1].mData;

for(int i = 0; i < inNumberFrames; i++)
{
    outL[i] = bufferTail[i * 2];
    outR[i] = bufferTail[i * 2 + 1];
}


where bufferTail is the pointer returned from TPCircularBufferTail.
Make sure that there is enough data in your buffer to satisfy
inNumberFrames. In case there isn't, then make sure the remainder of
the buffer is zeros. Sure your audio will glitch, but at least you
won't blow your users's ears

Hope that helps

-Kevin

On Thu, Nov 8, 2012 at 7:31 PM, Pier <email@hidden> wrote:
> hi all,
>
> I noticed that Mr Craig Bakalian had the same problem..
> http://www.mailinglistarchive.com/html/email@hidden/2006-10/msg00017.html
>
> Apparently the reason I have 2 buffers is that the Audio Unit returns an
> interleaved format. (left, right channels)
> To write to a file, I can do this
> AudioUnitGetProperty(mAudioUnit, kAudioUnitProperty_StreamFormat,
> kAudioUnitScope_Output, mBusNumber, &clientFormat, &size);
>
> ExtAudioFileSetProperty(mExtAudioFile,
> kExtAudioFileProperty_ClientDataFormat, size, &clientFormat);
>
> to set the extAudioFile to be the same format as the interleaved output of
> the AudioUnit. And it works producing a file recording of the mixed output
> from the mixer AudioUnit.
>
> However in my case I wish to directly manipulate the buffers and save it
> into TPCircularBuffer for use later. I feel like I'm really close to getting
> this but I'm still hearing static when I pull from these buffers and put
> them in TPCircularBuffer and play them back later.
>
>
> How can I do so? :/
>
>
> Thanks.
>
>
> Pier.
>
>
>
> On Thu, Nov 8, 2012 at 5:16 PM, Pier <email@hidden> wrote:
>>
>> Hi,
>>
>> I used
>>
>>         AURenderCallbackStruct mcallbackStruct;
>>
>>         mcallbackStruct.inputProc = mixedRecordingCallback;
>>
>>         mcallbackStruct.inputProcRefCon = &rio;
>>
>>         status = AudioUnitAddRenderNotify(_mixerUnit,
>> mcallbackStruct.inputProc,  mcallbackStruct.inputProcRefCon);
>>
>> to add the callback to my mixer AudioUnit.
>>
>> I'm getting static when trying to playback finalOutputBuffer (captured
>> below).
>> I've noticed that there are 2 buffers in ioData this time round - that
>> never happened before. I suspect that this could be the problem, has anyone
>> had any experience with this?
>>
>> Thanks.
>>
>> Pier.
>>
>> static OSStatus mixedRecordingCallback(void *inRefCon,
>>
>>                                          AudioUnitRenderActionFlags
>> *ioActionFlags,
>>
>>                                          const AudioTimeStamp
>> *inTimeStamp,
>>
>>                                          UInt32 inBusNumber,
>>
>>                                          UInt32 inNumberFrames,
>>
>>                                          AudioBufferList *ioData)
>>
>> {
>>
>>
>>
>>     if (*ioActionFlags & kAudioUnitRenderAction_PostRender) {
>>
>>
>>
>>         RIO *rio = (RIO*)inRefCon;
>>
>>         static int TEMP_kAudioUnitRenderAction_PostRenderError = (1 << 8);
>>
>>         SInt16 *targetBuffer;
>>
>>
>>
>>
>>
>>         if (rio->recordingMixed)
>>
>>         {
>>
>>             if (0 == inBusNumber && !(*ioActionFlags &
>> TEMP_kAudioUnitRenderAction_PostRenderError)) {
>>
>>             NSLog(@"Recording Mixed Output : Bus %ld", inBusNumber);
>>
>>
>>
>>             for (int i=0; i < ioData->mNumberBuffers; i++)
>>
>>             {
>>
>>                 targetBuffer= (SInt16*)ioData->mBuffers[i].mData;
>>
>>                 TPCircularBufferProduceBytes(&rio->finalOutputBuffer,
>> targetBuffer, inNumberFrames  * sizeof(SInt16));
>>
>>             }
>>
>>
>>
>>
>>             }
>>
>>         }
>>
>>     }
>>
>>     return noErr;
>>
>> }
>
>
>
>  _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> Coreaudio-api mailing list      (email@hidden)
> Help/Unsubscribe/Update your Subscription:
>
> This email sent to email@hidden
>
 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Coreaudio-api mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Follow-Ups:
    • Re: Static when playing back buffers
      • From: Pier <email@hidden>
References: 
 >Static when playing back buffers (From: Pier <email@hidden>)
 >Re: Static when playing back buffers (From: Pier <email@hidden>)

  • Prev by Date: Re: USB High-Speed uFrame Limitations
  • Next by Date: Re: Static when playing back buffers
  • Previous by thread: Re: Static when playing back buffers
  • Next by thread: Re: Static when playing back buffers
  • Index(es):
    • Date
    • Thread