// ----------------------------------------------------------
void ofxAudioUnitNetReceive::connectToHost(const std::string &address, unsigned long port)
// ----------------------------------------------------------
{
    stringstream ss;
    ss << address << ":" << port;
    CFStringRef hostName = CFStringCreateWithCString(kCFAllocatorDefault,
                           ss.str().c_str(),
                           kCFStringEncodingUTF8);

    OFXAU_PRINT(AudioUnitSetProperty(*_unit,
                                     kAUNetReceiveProperty_Hostname,
                                     kAudioUnitScope_Global,
                                     0,
                                     &hostName,
                                     sizeof(hostName)),
                "setting net receive host name");

    // setting net send disconnect to 0 to connect net receive because that makes sense
    UInt32 connect = 0;
    OFXAU_PRINT(AudioUnitSetProperty(*_unit,
                                     kAUNetSendProperty_Disconnect,
                                     kAudioUnitScope_Global,
                                     0,
                                     &connect,
                                     sizeof(connect)),
                "connecting net receive");

    CFRelease(hostName);
}
Пример #2
0
// ----------------------------------------------------------
ofxAudioUnit& ofxAudioUnitInput::connectTo(ofxAudioUnit &otherUnit, int destinationBus, int sourceBus)
// ----------------------------------------------------------
{
	AudioStreamBasicDescription ASBD;
	UInt32 ASBDSize = sizeof(ASBD);
	
	OFXAU_PRINT(AudioUnitGetProperty(otherUnit,
									 kAudioUnitProperty_StreamFormat,
									 kAudioUnitScope_Input,
									 destinationBus,
									 &ASBD,
									 &ASBDSize),
				"getting hardware input destination's format");
	
	OFXAU_PRINT(AudioUnitSetProperty(*_unit,
									 kAudioUnitProperty_StreamFormat,
									 kAudioUnitScope_Output,
									 1,
									 &ASBD,
									 sizeof(ASBD)),
				"setting hardware input's output format");
	
	AURenderCallbackStruct callback = {PullCallback, &_impl->ctx};
	otherUnit.setRenderCallback(callback, destinationBus);
	return otherUnit;
}
std::vector<UInt32> ofxAudioUnitMatrixMixer::getBusCount() const
{
	std::vector<UInt32> busCount;
	UInt32 inputBusCount, outputBusCount, inputSize, outputSize;
	inputBusCount = outputBusCount = 0;
	inputSize = outputSize = sizeof(UInt32);
	
	OFXAU_PRINT(AudioUnitGetProperty(*_unit,
									 kAudioUnitProperty_ElementCount,
									 kAudioUnitScope_Input,
									 0,
									 &inputBusCount,
									 &inputSize),
				"getting matrix mixer input bus count");
	
	OFXAU_PRINT(AudioUnitGetProperty(*_unit,
									 kAudioUnitProperty_ElementCount,
									 kAudioUnitScope_Output,
									 0,
									 &outputBusCount,
									 &outputSize),
				"getting matrix mixer output bus count");
	
	busCount.push_back(inputBusCount);
	busCount.push_back(outputBusCount);
	return busCount;
}
std::vector<AudioStreamBasicDescription> ofxAudioUnitMatrixMixer::getASBDs() const
{
	std::vector<AudioStreamBasicDescription> ASBDs;
	AudioStreamBasicDescription inputASBD, outputASBD;
	UInt32 inputSize, outputSize;
	inputSize = outputSize = sizeof(UInt32);
	
	OFXAU_PRINT(AudioUnitGetProperty(*_unit,
									 kAudioUnitProperty_StreamFormat,
									 kAudioUnitScope_Input,
									 0,
									 &inputASBD,
									 &inputSize),
				"getting matrix mixer input ASBD");
	
	OFXAU_PRINT(AudioUnitGetProperty(*_unit,
									 kAudioUnitProperty_StreamFormat,
									 kAudioUnitScope_Output,
									 0,
									 &outputASBD,
									 &outputSize),
				"getting matrix mixer output ASBD");
	
	ASBDs.push_back(inputASBD);
	ASBDs.push_back(outputASBD);
	return ASBDs;
}
Пример #5
0
// ----------------------------------------------------------
ofxAudioUnitInput::ofxAudioUnitInput(unsigned int samplesToBuffer)
: _impl(new InputImpl)
// ----------------------------------------------------------
{
	_desc = inputDesc;
	initUnit();
	
	AudioStreamBasicDescription ASBD = {0};
	UInt32 ASBD_size = sizeof(ASBD);
	OFXAU_PRINT(AudioUnitGetProperty(*_unit,
									 kAudioUnitProperty_StreamFormat,
									 kAudioUnitScope_Output,
									 1,
									 &ASBD,
									 &ASBD_size),
				"getting input ASBD");
	
	_impl->ctx.inputUnit  = _unit;
	_impl->ctx.bufferList = AudioBufferListRef(AudioBufferListAlloc(ASBD.mChannelsPerFrame, 1024), AudioBufferListRelease);
	_impl->ctx.circularBuffers.resize(ASBD.mChannelsPerFrame);
	_impl->isReady = false;
	
#if !TARGET_OS_IPHONE
	_impl->inputDeviceID = DefaultAudioInputDevice();
#endif
	
	for(int i = 0; i < ASBD.mChannelsPerFrame; i++) {
		TPCircularBufferInit(&_impl->ctx.circularBuffers[i], samplesToBuffer * sizeof(Float32));
	}
}
Пример #6
0
// ----------------------------------------------------------
OSStatus RenderCallback(void *inRefCon,
						AudioUnitRenderActionFlags *ioActionFlags,
						const AudioTimeStamp *inTimeStamp,
						UInt32 inBusNumber,
						UInt32 inNumberFrames,
						AudioBufferList *ioData)
// ----------------------------------------------------------
{
	InputContext * ctx = static_cast<InputContext *>(inRefCon);
	
	OSStatus s = AudioUnitRender(*(ctx->inputUnit),
								 ioActionFlags,
								 inTimeStamp,
								 inBusNumber,
								 inNumberFrames,
								 ctx->bufferList.get());
	
	OFXAU_PRINT(s, "rendering audio input");
	
	if(s == noErr) {
		size_t buffersToCopy = std::min<size_t>(ctx->bufferList->mNumberBuffers, ctx->circularBuffers.size());
		
		for(int i = 0; i < buffersToCopy; i++) {
			TPCircularBuffer * circBuffer = &ctx->circularBuffers[i];
			if(circBuffer) {
				TPCircularBufferProduceBytes(circBuffer,
											 ctx->bufferList->mBuffers[i].mData,
											 inNumberFrames * sizeof(Float32));
			}
		}
	}
	
	return s;
}
// ----------------------------------------------------------
bool ofxAudioUnitSampler::setSamples(const std::vector<std::string> &samplePaths)
// ----------------------------------------------------------
{
	CFURLRef sampleURLs[samplePaths.size()];
	
	for(int i = 0; i < samplePaths.size(); i++)
	{
		sampleURLs[i] = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault,
																(const UInt8 *)samplePaths[i].c_str(),
																samplePaths[i].length(),
																NULL);
	}
	
	CFArrayRef samples = CFArrayCreate(NULL, (const void **)&sampleURLs, samplePaths.size(), &kCFTypeArrayCallBacks);
	
	OSStatus s = AudioUnitSetProperty(*_unit,
									 kAUSamplerProperty_LoadAudioFiles,
									 kAudioUnitScope_Global,
									 0,
									 &samples,
									 sizeof(samples));
	
	OFXAU_PRINT(s, "setting ofxAudioUnitSampler's source samples");
	
	for(int i = 0; i < samplePaths.size(); i++) CFRelease(sampleURLs[i]);
	
	CFRelease(samples);
	
	return s == noErr;
}
void ofxAudioUnitMatrixMixer::initWithLayout(UInt32 inputBusCount, UInt32 outputBusCount, AudioStreamBasicDescription * inASBD, AudioStreamBasicDescription * outASBD)
{
	_desc = matrixMixerDesc;
	_unit = allocUnit(_desc);
	
	OFXAU_PRINT(AudioUnitSetProperty(*_unit,
									 kAudioUnitProperty_ElementCount,
									 kAudioUnitScope_Input,
									 0,
									 &inputBusCount,
									 sizeof(inputBusCount)),
				"setting number of input busses");
	
	OFXAU_PRINT(AudioUnitSetProperty(*_unit,
									 kAudioUnitProperty_ElementCount,
									 kAudioUnitScope_Output,
									 0,
									 &outputBusCount,
									 sizeof(outputBusCount)),
				"setting number of output busses");
	
	if(inASBD) {
		for(int i = 0; i < inputBusCount; i++) {
			OFXAU_PRINT(AudioUnitSetProperty(*_unit,
											 kAudioUnitProperty_StreamFormat,
											 kAudioUnitScope_Input,
											 i,
											 inASBD,
											 sizeof(AudioStreamBasicDescription)),
						"setting matrix mixer input ASBD");
		}
	}
	
	if(outASBD) {
		for(int i = 0; i < outputBusCount; i++) {
			OFXAU_PRINT(AudioUnitSetProperty(*_unit,
											 kAudioUnitProperty_StreamFormat,
											 kAudioUnitScope_Output,
											 i,
											 outASBD,
											 sizeof(AudioStreamBasicDescription)),
						"setting matrix mixer output ASBD");
		}
	}
	
	OFXAU_PRINT(AudioUnitInitialize(*_unit), "initializing matrix mixer unit");
}
Пример #9
0
// ----------------------------------------------------------
ofxAudioUnitMidiReceiver::ofxAudioUnitMidiReceiver(string clientName)
: _client(NULL), _endpoint(NULL), _port(NULL), _unit(NULL)
// ----------------------------------------------------------
{
	CFStringRef cName = CFStringCreateWithCString(kCFAllocatorDefault, clientName.c_str(), kCFStringEncodingUTF8);
	OFXAU_PRINT(MIDIClientCreate(cName, ofxAudioUnitMidiInputProc, this, &_client), 
				"creating MIDI client");
	CFRelease(cName);
}
Пример #10
0
// ----------------------------------------------------------
void ofxAudioUnitNetReceive::disconnect()
// ----------------------------------------------------------
{
    UInt32 disconnect = 1;
    OFXAU_PRINT(AudioUnitSetProperty(*_unit,
                                     kAUNetSendProperty_Disconnect,
                                     kAudioUnitScope_Global,
                                     0,
                                     &disconnect,
                                     sizeof(disconnect)),
                "disconnecting net receive");
}
AudioTimeStamp ofxAudioUnitFilePlayer::getCurrentTimestamp() const {
	AudioTimeStamp timeStamp = {0};
	UInt32 timeStampSize = sizeof(AudioTimeStamp);
	
	OFXAU_PRINT(AudioUnitGetProperty(*_unit,
									 kAudioUnitProperty_CurrentPlayTime,
									 kAudioUnitScope_Global,
									 0,
									 &timeStamp,
									 &timeStampSize),
				"getting time stamp from file player");
	
	return timeStamp;
}
// ----------------------------------------------------------
ofxAudioUnitSpeechSynth::ofxAudioUnitSpeechSynth()
// ----------------------------------------------------------
{
	_desc = speechDesc;
	initUnit();
	UInt32 dataSize = sizeof(SpeechChannel);
	
	OFXAU_PRINT(AudioUnitGetProperty(*_unit,
									 kAudioUnitProperty_SpeechChannel,
									 kAudioUnitScope_Global,
									 0,
									 &_channel,
									 &dataSize),
				"getting speech channel");
}
Пример #13
0
// ----------------------------------------------------------
OSStatus ofxAudioUnitInput::renderCallback(void *inRefCon,
										   AudioUnitRenderActionFlags *ioActionFlags,
										   const AudioTimeStamp *inTimeStamp,
										   UInt32 inBusNumber,
										   UInt32 inNumberFrames,
										   AudioBufferList *ioData)
// ----------------------------------------------------------
{
	RenderContext * ctx = reinterpret_cast<RenderContext *>(inRefCon);
	
	OSStatus s = AudioUnitRender(*(ctx->inputUnit),
								 ioActionFlags,
								 inTimeStamp,
								 inBusNumber,
								 inNumberFrames,
								 ctx->ringBuffer->writeHead());
	
	OFXAU_PRINT(s, "rendering audio input");
	
	if(s == noErr) ctx->ringBuffer->advanceWriteHead();
	
	return s;
}
// ----------------------------------------------------------
bool ofxAudioUnitSampler::setSample(const std::string &samplePath)
// ----------------------------------------------------------
{
	CFURLRef sampleURL[1] = {CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault,
																	 (const UInt8 *)samplePath.c_str(),
																	 samplePath.length(),
																	 NULL)};
	
	CFArrayRef sample = CFArrayCreate(NULL, (const void **)&sampleURL, 1, &kCFTypeArrayCallBacks);

	OFXAU_PRINT(AudioUnitSetProperty(*_unit,
									 kAUSamplerProperty_LoadAudioFiles,
									 kAudioUnitScope_Global,
									 0,
									 &sample,
									 sizeof(sample)),
				"setting ofxAudioUnitSampler's source sample");
	
	CFRelease(sample);
	CFRelease(sampleURL[0]);
	
	return true;
}
Пример #15
0
// ----------------------------------------------------------
void ofxAudioUnitMidiReceiver::disconnectFromMidiSource(unsigned long midiSourceIndex)
// ----------------------------------------------------------
{
	OFXAU_PRINT(MIDIPortDisconnectSource(_port, MIDIGetSource(midiSourceIndex)), 
				"disconnecting from MIDI source");
}