Trying to do something that *should* be simple...
Trying to do something that *should* be simple...
- Subject: Trying to do something that *should* be simple...
- From: Jeff Heard <email@hidden>
- Date: Mon, 28 Dec 2009 19:58:14 -0500
Okay, I've created two audio queues, one output and one input. And no, I don't have them both on at once, because I know well that wont' work. All I want to do is sample sound from the input and then replay the frequency of that sound as the output. Can anyone help me? It seems to work if I try to get it to play a constant 440hZ, but when it starts after finding the new frequency, it plays 1/2 second of audio and then I get silence. My code, which seems sane looks like this:
// MainViewController.m:
- (void) onPressed { // should pause the output and listen for new sound
AudioQueuePause(aqc->outQueue); // stop the input so the mic can listen
AudioQueueEnqueueBuffer(aqc->inQueue, aqc->mBuffers[0], 0, NULL); // enqueue an input buffer to the mic queue
AudioQueueStart(aqc->inQueue, NULL); // start the input queue
}
- (void) onReleased { // should stop recording and start replaying the frequency
AudioQueueStop(aqc->inQueue,TRUE); // stop the input queue
AudioQueueStart(aqc->outQueue, NULL);
}
// Audio.c
AQCallbackStruct *SetupAudioQueues() {
AQCallbackStruct *aqc = malloc(sizeof(AQCallbackStruct));
int i;
int aqniStatus;
aqc->mDataFormat.mSampleRate = 44100.0;
aqc->mDataFormat.mFormatID = kAudioFormatLinearPCM;
aqc->mDataFormat.mFormatFlags =
kLinearPCMFormatFlagIsSignedInteger |
kLinearPCMFormatFlagIsPacked;
aqc->mDataFormat.mBytesPerPacket = 4;
aqc->mDataFormat.mFramesPerPacket = 1;
aqc->mDataFormat.mBytesPerFrame = 4;
aqc->mDataFormat.mChannelsPerFrame = 2;
aqc->mDataFormat.mBitsPerChannel = 16;
aqc->frameCount = 4410;
aqc->frameSize = aqc->frameCount * aqc->mDataFormat.mBytesPerFrame;
aqc->frequency = 0;
aqc->amplitude = 4096;
aqc->check = FALSE;
aqniStatus = AudioQueueNewInput(
&(aqc->mDataFormat)
, AQInputCallback
, aqc
, NULL
, kCFRunLoopCommonModes
, 0
, &(aqc->inQueue));
aqniStatus = AudioQueueNewOutput(
&(aqc->mDataFormat)
, AQOutputCallback
, aqc
, NULL
, kCFRunLoopCommonModes
, 0
, &(aqc->outQueue));
for(i=0; i< AUDIO_BUFFERS / 2; i++) {
AudioQueueAllocateBuffer(aqc->inQueue, aqc->frameSize, &(aqc->mBuffers[i]));
}
for(i=AUDIO_BUFFERS/2; i < AUDIO_BUFFERS; i++) {
aqniStatus = AudioQueueAllocateBuffer(aqc->outQueue, aqc->frameSize, &(aqc->mBuffers[i]));
AQOutputCallback(aqc, aqc->outQueue, aqc->mBuffers[i]);
}
aqniStatus = AudioQueueStart(aqc->outQueue, NULL);
return aqc;
}
static void AQInputCallback
(void *aqr,
AudioQueueRef inQ,
AudioQueueBufferRef inQB,
const AudioTimeStamp *timestamp,
UInt32 frameSize,
const AudioStreamPacketDescription *mDataFormat)
{
AQCallbackStruct *aqc = (AQCallbackStruct*)aqr;
// should find the frequency of the input sound and store it in frequency
aqc->frequency = autoCorrelation(&(((SInt16*)inQB->mAudioData)[0]), aqc->frameCount*2);
}
// this I've confirmed works by subsituting 440 in for the frequency...
static void AQOutputCallback
(void *aqr,
AudioQueueRef inQ,
AudioQueueBufferRef outQB)
{
AQCallbackStruct *aqc = (AQCallbackStruct*)aqr;
SInt16 *CoreAudioBuffer = outQB->mAudioData;
outQB->mAudioDataByteSize = 4*aqc->frameCount;
for (int i=0; i<aqc->frameCount*2; i+=2) {
CoreAudioBuffer[i] = waveform(i, aqc->mDataFormat.mSampleRate/2, aqc->frequency, aqc->amplitude, 0, 0);
CoreAudioBuffer[i+1] = waveform(i, aqc->mDataFormat.mSampleRate/2, aqc->frequency, aqc->amplitude, 0, 0);
}
AudioQueueEnqueueBuffer(inQ, outQB, 0, NULL);
}
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden