Daisy and captureCurrentPtr
Daisy and captureCurrentPtr
- Subject: Daisy and captureCurrentPtr
- From: Craig Bakalian <email@hidden>
- Date: Thu, 5 Feb 2004 16:04:38 -0500
Hi Jens,
Enclosed is the code I have modified from Daisy. I think it is
working. I gotta save the captureStorage to disk to see if it is
actually storing Audio data, or play it back somehow. Shesh, this is a
journey!
Please read thru, and tell me if I am sewing invisible fabric :)).
There was an odd thing is the IOProc, I had to make sure that the
ioData->mBuffers[0].mData was not 0x0. I didn't see this in Daisy.
#import <Cocoa/Cocoa.h>
#import <CoreAudio/CoreAudio.h>
#import <AudioUnit/AudioUnit.h>
#import <AudioToolbox/AudioToolbox.h>
#import <Carbon/Carbon.h>
@interface MyWindowController : NSWindowController
{
AudioDeviceID deviceID;
AUGraph mainGraph;
AUNode reverbNode;
AudioUnit reverbUnit;
AUNode micNode;
AudioUnit micUnit;
BOOL captureInput;
Ptr captureStorage;
Ptr captureCurrentPtr;
UInt32 captureTotalBytesCaptured;
}
-(void)buildGraph;
-(IBAction)recordBuffers: (id)sender;
-(IBAction)stopRecordingBuffers: (id)sender;
@end
#import "MyWindowController.h"
#define kSizeOfCaptureBuffer 6000000
OSStatus myInputCallback(void *inRefCon,
AudioUnitRenderActionFlags inActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumFrames,
AudioBufferList *ioData);
@implementation MyWindowController
-(id)init
{
self = [super initWithWindowNibName: @"MainMenu"];
return self;
}
-(void)dealloc
{
}
-(void)buildGraph
{
ComponentResult result;
NewAUGraph(&mainGraph);
AUGraphOpen(mainGraph);
UInt32 size;
size = sizeof(AudioDeviceID);
AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice,
&size, &deviceID);
ComponentDescription mic;
mic.componentType = kAudioUnitType_Output;
mic.componentSubType = kAudioUnitSubType_HALOutput;
mic.componentManufacturer = kAudioUnitManufacturer_Apple;
mic.componentFlags = 0;
mic.componentFlagsMask = 0;
AUGraphNewNode(mainGraph, &mic, 0, NULL, &micNode);
AUGraphGetNodeInfo(mainGraph, micNode, NULL, NULL,NULL, &micUnit);
UInt32 enableIO = 1;
result = AudioUnitSetProperty(micUnit,
kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &enableIO,
sizeof(UInt32));
result = AudioUnitSetProperty(micUnit,
kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 0,
&enableIO, sizeof(UInt32));
result = AudioUnitSetProperty(micUnit,
kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0,
&deviceID, sizeof(UInt32));
UInt32 hasIO=0;
UInt32 dataSize = sizeof(UInt32);
result = AudioUnitGetProperty(micUnit, kAudioOutputUnitProperty_HasIO,
kAudioUnitScope_Input, 1, &hasIO, &dataSize );
ComponentDescription reverb;
reverb.componentFlags = 0;
reverb.componentFlagsMask = 0;
reverb.componentType = kAudioUnitType_Effect;
reverb.componentSubType = kAudioUnitSubType_MatrixReverb;
reverb.componentManufacturer = kAudioUnitManufacturer_Apple;
AUGraphNewNode(mainGraph, &reverb, 0, NULL, &reverbNode);
AUGraphGetNodeInfo(mainGraph, reverbNode, NULL, NULL,NULL,
&reverbUnit);
OSStatus err;
err = AUGraphConnectNodeInput(mainGraph, micNode, 1, reverbNode, 0);
err = AUGraphConnectNodeInput(mainGraph, reverbNode, 0, micNode, 0);
err = AUGraphInitialize(mainGraph);
err = AUGraphStart(mainGraph);
}
OSStatus myInputCallback(void *inRefCon,
AudioUnitRenderActionFlags inActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumFrames,
AudioBufferList *ioData)
{
MyWindowController *con = (MyWindowController *)inRefCon;
if((ioData != NULL) && (ioData->mNumberBuffers > 0))
{
if(con->captureInput)
{
if(con->captureCurrentPtr + ioData->mBuffers[0].mDataByteSize <
con->captureStorage + kSizeOfCaptureBuffer)
{
if(ioData->mBuffers[0].mData)
{
BlockMove(ioData->mBuffers[0].mData, con->captureCurrentPtr,
ioData->mBuffers[0].mDataByteSize);
con->captureCurrentPtr += ioData->mBuffers[0].mDataByteSize;
con->captureTotalBytesCaptured +=
ioData->mBuffers[0].mDataByteSize;
}
}
}
}
return 0;
}
-(IBAction)recordBuffers: (id)sender
{
[self buildGraph];
captureCurrentPtr = NULL;
if(captureInput == NO)
{
if (captureStorage == NULL)
{
captureStorage = malloc(kSizeOfCaptureBuffer);
if (captureStorage != NULL)
captureInput = YES;
}
else
captureInput = YES;
if (captureInput)
{
captureCurrentPtr = captureStorage;
captureTotalBytesCaptured = 0;
AudioUnitAddRenderNotify(reverbUnit,(AURenderCallback)myInputCallback,se
lf);
}
}
else
{
captureInput=NO;
}
}
-(IBAction)stopRecordingBuffers: (id)sender
{
AudioUnitRemoveRenderNotify(reverbUnit,(AURenderCallback)myInputCallback
,self);
AUGraphStop(mainGraph);
AUGraphUninitialize(mainGraph);
AUGraphClose(mainGraph);
}
@end
_______________________________________________
coreaudio-api mailing list | email@hidden
Help/Unsubscribe/Archives:
http://www.lists.apple.com/mailman/listinfo/coreaudio-api
Do not post admin requests to the list. They will be ignored.