コード例 #1
0
ファイル: PAEngine.cpp プロジェクト: Cyclic/PulseAudioOSX
bool
PAEngine::initHardware(IOService *provider)
{
	UInt32 sampleRates[] = SAMPLERATES;
	IOAudioSampleRate sampleRate;

	debugFunctionEnter();

	device = OSDynamicCast(PADevice, provider);
	if (!device)
		return false;

	if (!super::initHardware(provider))
		return false;

	virtualDeviceArray = OSArray::withCapacity(1);
	if (!virtualDeviceArray) {
		IOLog("%s(%p)::%s unable to allocate memory\n", getName(), this, __func__);
		return false;
	}
	
	sampleRate.whole = sampleRates[0];
	sampleRate.fraction = 0;
	setSampleRate(&sampleRate);
	setNewSampleRate(sampleRate.whole);

	setDescription(info->name);
	setNumSampleFramesPerBuffer(NUM_SAMPLE_FRAMES);

	info->audioBufferSize = AUDIO_BUFFER_SIZE * nStreams;

	audioInBuf  = IOBufferMemoryDescriptor::withCapacity(info->audioBufferSize, kIODirectionInOut);
	audioOutBuf = IOBufferMemoryDescriptor::withCapacity(info->audioBufferSize, kIODirectionInOut);
	
	if (!audioInBuf || !audioOutBuf) {
		IOLog("%s(%p)::%s unable to allocate memory\n", getName(), this, __func__);
		return false;
	}

	audioInBuf->prepare();
	audioOutBuf->prepare();

	for (UInt32 i = 0; i < nStreams; i++) {
		IOAudioStream *stream;
		char *streamBuf;

		if (i * CHANNELS_PER_STREAM < channelsIn) {
			streamBuf = (char *) audioInBuf->getBytesNoCopy() + (i * AUDIO_BUFFER_SIZE);
			stream = createNewAudioStream(kIOAudioStreamDirectionInput, streamBuf);
			if (!stream) {
				IOLog("%s(%p)::%s failed to create audio streams\n", getName(), this, __func__);
				return false;
			}

			addAudioStream(stream);
			audioStream[i * 2] = stream;
			stream->release();
		}

		if (i * CHANNELS_PER_STREAM < channelsOut) {
			streamBuf = (char *) audioOutBuf->getBytesNoCopy() + (i * AUDIO_BUFFER_SIZE);
			stream = createNewAudioStream(kIOAudioStreamDirectionOutput, streamBuf);
			if (!stream) {
				IOLog("%s(%p)::%s failed to create audio streams\n", getName(), this, __func__);
				return false;
			}

			addAudioStream(stream);
			audioStream[(i * 2) + 1] = stream;
			stream->release();
		}
	}

	if (info->audioContentType == kPADeviceAudioContentMixdown)
		return addVirtualDevice(info, audioInBuf, audioOutBuf, this) == kIOReturnSuccess;

	return true;
}
コード例 #2
0
bool kXAudioEngine::initHardware(IOService *provider)
{
    bool result = false;
    IOAudioSampleRate initialSampleRate;
    IOAudioStream *audioStream;
    
    debug("kXAudioEngine[%p]::initHardware(%p)\n", this, provider);
    
    if (!super::initHardware(provider)) {
        goto Done;
    }
    
		// Setup the initial sample rate for the audio engine
    initialSampleRate.whole = sampling_rate;
    initialSampleRate.fraction = 0;
    
    char device_name[KX_MAX_STRING];
    strncpy(device_name,"kX ",KX_MAX_STRING);
    strncat(device_name,hw->card_name,KX_MAX_STRING);
    
    setDescription(device_name);
    
    setSampleRate(&initialSampleRate);
    
    setClockDomain(); // =kIOAudioNewClockDomain
    
		// calculate kx_sample_offset
    
    if(hw->is_10k2)
    {
			// setSampleOffset(28); // 28 samples
		setSampleLatency(28+1);
    }
    else
    {
			// setSampleOffset(32); // 32 samples
		setSampleLatency(32+1);
    }
    
		// Allocate our input and output buffers
    for(int i=0;i<n_channels;i++)
    {
			// Create an IOAudioStream for each buffer and add it to this audio engine
		audioStream = createNewAudioStream(i,kIOAudioStreamDirectionOutput, 1*n_frames*bps/8);
		if (!audioStream) {
			goto Done;
		}
		
		addAudioStream(audioStream);
		out_streams[i]=audioStream;
    }
    
		// recording
    audioStream = createNewAudioStream(0,kIOAudioStreamDirectionInput, n_channels*n_frames*bps/8);
    if (!audioStream) {
		goto Done;
    }
    
    addAudioStream(audioStream);
    in_streams[0]=audioStream;
    
    dump_addr();
    
		// Set the number of sample frames in each buffer
    setNumSampleFramesPerBuffer(n_frames);
    
    result = true;
    
Done:
    if(result==false)
		free_all();
    
    return result;
}