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; }
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; }