Re: iPhone Custom Audio Unit: why buzz?
Re: iPhone Custom Audio Unit: why buzz?
- Subject: Re: iPhone Custom Audio Unit: why buzz?
- From: tahome izwah <email@hidden>
- Date: Sun, 7 Mar 2010 10:16:45 +0100
Looks like you're clipping your sine wave and resetting its phase
every 512 frames. Did you try the code that I posted below?
--th
2010/3/6 Sung <email@hidden>:
> Yeah, I am trying the same thing. I put a movie sample on YouTube for what
> I mean by
> 'buzz' : www.youtube.com/watch?v=9gCkxvsuB7Y
>
> On Sat, Mar 6, 2010 at 12:15 PM, tahome izwah <email@hidden> wrote:
>>
>> Just to be sure, you can calculate a sinewave with the following line of
>> code:
>>
>> static float j = 0.; // this is your j
>>
>> toneBuffer[frame] =
>> (SInt16)(32767.*sin(fmod(frequency*2.*M_PI*j++/kGraphSampleRate,
>> 2.*M_PI)));
>>
>> HTH
>> --th
>>
>> 2010/3/6 Sung <email@hidden>:
>> > Thanks for the reply.
>> > Making 'j' static didn't make a difference. In AudioQueue, I can
>> > definitely
>> > hear 'clicks' if
>> > I don't keep track of starting frame count of each callbacks. AU seems
>> > different, strange.
>> >
>> > I checked inNumberFrames = 512. Either way, it didn't help.
>> > You're also right about being safe with 32767. No change though.
>> > static OSStatus renderInput(void *inRefCon, AudioUnitRenderActionFlags
>> > *ioActionFlags,
>> > const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32
>> > inNumberFrames, AudioBufferList *ioData)
>> > {
>> > double frequency = 440.0;
>> > static double j = 0.0;
>> > double cycleLength = kGraphSampleRate / frequency;
>> > SInt16 *toneBuffer = (SInt16 *)ioData->mBuffers[0].mData
>> > for (UInt32 frame; frame<inNumberFrames; ++frame)
>> > {
>> > Float32 nextFloat = sin(j/cycleLength * (M_PI*2.0)) ;
>> > toneBuffer[frame] = 32767.0*nextFloat;
>> > j += 1.0;
>> > if (j>cycleLength) {
>> > j = j - cycleLength;
>> > }
>> > }
>> > return noErr;
>> > }
>> > On Sat, Mar 6, 2010 at 2:03 AM, tahome izwah <email@hidden>
>> > wrote:
>> >>
>> >> Of course it buzzes if your cycle length doesn't coincide with
>> >> inNumberFrames. You need to remember your "j" across calls (make it
>> >> static to see if it solves your problem).
>> >>
>> >> Also, why are you using 512 instead of inNumberFrames in your loop?
>> >> That doesn't make much sense to me as there is no reason to believe
>> >> that inNumberFrames will always be 512 frames.
>> >>
>> >> In addition, your sine wave will cause digital clipping (wrapping)
>> >> when you multiply the result of the sin() call by 32768. Make sure you
>> >> limit your output to the range -32768...32767 to be on the safe side.
>> >>
>> >> HTH
>> >> --th
>> >>
>> >>
>> >> 2010/3/6 Sung <email@hidden>:
>> >> > Hi all,
>> >> > There was a thread about creating a custom AU to play a simple sine
>> >> > wave:
>> >> > http://lists.apple.com/archives/coreaudio-api/2008/nov/msg00292.html
>> >> > I did the same thing and use the DefaultOutputUnit example from Apple
>> >> > sample
>> >> > to construct sine tone in callback:
>> >> > static OSStatus renderInput(void *inRefCon,
>> >> > AudioUnitRenderActionFlags
>> >> > *ioActionFlags,
>> >> > const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32
>> >> > inNumberFrames, AudioBufferList *ioData)
>> >> > {
>> >> > double frequency = 440.0;
>> >> > double j = 0.0;
>> >> > double cycleLength = kGraphSampleRate / frequency;
>> >> > SInt16 *toneBuffer = (SInt16 *)ioData->mBuffers[0].mData
>> >> > for (UInt32 frame; frame<512; ++frame)
>> >> > {
>> >> > Float32 nextFloat = sin(j/cycleLength * (M_PI*2.0)) ;
>> >> > toneBuffer[frame] = 32768.0*nextFloat;
>> >> > j += 1.0;
>> >> > if (j>cycleLength) {
>> >> > j = j - cycleLength;
>> >> > }
>> >> > }
>> >> > return noErr;
>> >> > }
>> >> > It works in iphone simulator, but :
>> >> > - the sound that comes out is "buzz saw" noise instead of a pure sine
>> >> > tone.
>> >> > - on a device, the sound only comes out of headphone, not through the
>> >> > speaker.
>> >> > Does any of you have similar issues?
>> >> >
>> >> >
>> >
>> >
>
>
_______________________________________________
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