Lines Matching defs:patch

69 /* Connect a patch between several source and sink ports */
70 status_t AudioFlinger::createAudioPatch(const struct audio_patch *patch,
75 return mPatchPanel->createAudioPatch(patch, handle);
80 /* Disconnect a patch */
138 /* Connect a patch between several source and sink ports */
139 status_t AudioFlinger::PatchPanel::createAudioPatch(const struct audio_patch *patch,
143 patch->num_sources, patch->num_sinks, *handle);
151 if (handle == NULL || patch == NULL) {
154 if (patch->num_sources == 0 || patch->num_sources > AUDIO_PATCH_PORTS_MAX ||
155 patch->num_sinks == 0 || patch->num_sinks > AUDIO_PATCH_PORTS_MAX) {
159 // only the audio policy manager can request a patch creation with 2 sources.
160 if (patch->num_sources > 2) {
167 ALOGV("createAudioPatch() removing patch handle %d", *handle);
177 Patch *newPatch = new Patch(patch);
179 switch (patch->sources[0].type) {
181 audio_module_handle_t srcModule = patch->sources[0].ext.device.hw_module;
189 for (unsigned int i = 0; i < patch->num_sinks; i++) {
191 if ((patch->sinks[i].type == AUDIO_PORT_TYPE_MIX ||
192 patch->sinks[i].ext.mix.hw_module != srcModule) &&
193 patch->num_sinks > 1) {
198 if (patch->sinks[i].type != patch->sinks[0].type) {
199 ALOGW("createAudioPatch() different sink types in same patch not supported");
204 if (patch->sinks[i].ext.mix.hw_module == srcModule &&
206 (patch->sinks[i].type != AUDIO_PORT_TYPE_MIX)) {
208 patch->sinks[i].type);
214 if (patch->sinks[0].ext.device.hw_module != srcModule) {
216 if (patch->sinks[0].type != AUDIO_PORT_TYPE_DEVICE) {
223 if (patch->num_sources == 2) {
224 if (patch->sources[1].type != AUDIO_PORT_TYPE_MIX ||
225 patch->sinks[0].ext.device.hw_module !=
226 patch->sources[1].ext.mix.hw_module) {
233 audioflinger->checkPlaybackThread_l(patch->sources[1].ext.mix.handle);
242 audio_devices_t device = patch->sinks[0].ext.device.type;
243 String8 address = String8(patch->sinks[0].ext.device.address);
246 patch->sinks[0].ext.device.hw_module,
260 audio_devices_t device = patch->sources[0].ext.device.type;
261 String8 address = String8(patch->sources[0].ext.device.address);
281 status = createPatchConnections(newPatch, patch);
287 if (patch->sinks[0].type == AUDIO_PORT_TYPE_MIX) {
289 patch->sinks[0].ext.mix.handle);
292 patch->sinks[0].ext.mix.handle);
296 status = thread->sendCreateAudioPatchConfigEvent(patch, &halHandle);
300 patch->num_sources,
301 patch->sources,
302 patch->num_sinks,
303 patch->sinks,
308 patch->sinks[0].ext.mix.handle);
311 patch->sinks[0].ext.mix.handle);
316 if (strcmp(patch->sources[0].ext.device.address, "") != 0) {
318 patch->sources[0].ext.device.type,
319 patch->sources[0].ext.device.address);
326 (int)patch->sources[0].ext.device.type);
328 (int)patch->sinks[0].ext.mix.usecase.source);
336 audio_module_handle_t srcModule = patch->sources[0].ext.mix.hw_module;
344 for (unsigned int i = 0; i < patch->num_sinks; i++) {
345 if (patch->sinks[i].type != AUDIO_PORT_TYPE_DEVICE) {
347 patch->sinks[i].type);
352 if (patch->sinks[i].ext.device.hw_module != srcModule) {
359 audioflinger->checkPlaybackThread_l(patch->sources[0].ext.mix.handle);
362 patch->sources[0].ext.mix.handle);
367 status = thread->sendCreateAudioPatchConfigEvent(patch, &halHandle);
370 for (unsigned int i = 0; i < patch->num_sinks; i++) {
371 type |= patch->sinks[i].ext.device.type;
374 if (strcmp(patch->sinks[0].ext.device.address, "") != 0) {
377 patch->sinks[0].ext.device.type,
378 patch->sinks[0].ext.device.address);
400 ALOGV("createAudioPatch() added new patch handle %d halHandle %d", *handle, halHandle);
408 status_t AudioFlinger::PatchPanel::createPatchConnections(Patch *patch,
411 // create patch from source device to record thread input
417 patch->mRecordThread->getAudioPortConfig(&subPatch.sinks[0]);
420 status_t status = createAudioPatch(&subPatch, &patch->mRecordPatchHandle);
422 patch->mRecordPatchHandle = AUDIO_PATCH_HANDLE_NONE;
426 // create patch from playback thread output to sink device
427 patch->mPlaybackThread->getAudioPortConfig(&subPatch.sources[0]);
429 status = createAudioPatch(&subPatch, &patch->mPlaybackPatchHandle);
431 patch->mPlaybackPatchHandle = AUDIO_PATCH_HANDLE_NONE;
436 size_t playbackFrameCount = patch->mPlaybackThread->frameCount();
438 size_t recordFramecount = patch->mRecordThread->frameCount();
448 uint32_t channelCount = patch->mPlaybackThread->channelCount();
450 audio_channel_mask_t outChannelMask = patch->mPlaybackThread->channelMask();
451 uint32_t sampleRate = patch->mPlaybackThread->sampleRate();
452 audio_format_t format = patch->mPlaybackThread->format();
454 patch->mPatchRecord = new RecordThread::PatchRecord(
455 patch->mRecordThread.get(),
462 if (patch->mPatchRecord == 0) {
465 status = patch->mPatchRecord->initCheck();
469 patch->mRecordThread->addPatchRecord(patch->mPatchRecord);
473 patch->mPatchTrack = new PlaybackThread::PatchTrack(
474 patch->mPlaybackThread.get(),
479 patch->mPatchRecord->buffer(),
481 if (patch->mPatchTrack == 0) {
484 status = patch->mPatchTrack->initCheck();
488 patch->mPlaybackThread->addPatchTrack(patch->mPatchTrack);
491 patch->mPatchRecord->setPeerProxy(patch->mPatchTrack.get());
492 patch->mPatchTrack->setPeerProxy(patch->mPatchRecord.get());
495 patch->mPatchRecord->start(AudioSystem::SYNC_EVENT_NONE, 0);
496 patch->mPatchTrack->start();
501 void AudioFlinger::PatchPanel::clearPatchConnections(Patch *patch)
508 ALOGV("clearPatchConnections() patch->mRecordPatchHandle %d patch->mPlaybackPatchHandle %d",
509 patch->mRecordPatchHandle, patch->mPlaybackPatchHandle);
511 if (patch->mPatchRecord != 0) {
512 patch->mPatchRecord->stop();
514 if (patch->mPatchTrack != 0) {
515 patch->mPatchTrack->stop();
517 if (patch->mRecordPatchHandle != AUDIO_PATCH_HANDLE_NONE) {
518 releaseAudioPatch(patch->mRecordPatchHandle);
519 patch->mRecordPatchHandle = AUDIO_PATCH_HANDLE_NONE;
521 if (patch->mPlaybackPatchHandle != AUDIO_PATCH_HANDLE_NONE) {
522 releaseAudioPatch(patch->mPlaybackPatchHandle);
523 patch->mPlaybackPatchHandle = AUDIO_PATCH_HANDLE_NONE;
525 if (patch->mRecordThread != 0) {
526 if (patch->mPatchRecord != 0) {
527 patch->mRecordThread->deletePatchRecord(patch->mPatchRecord);
528 patch->mPatchRecord.clear();
530 audioflinger->closeInputInternal_l(patch->mRecordThread);
531 patch->mRecordThread.clear();
533 if (patch->mPlaybackThread != 0) {
534 if (patch->mPatchTrack != 0) {
535 patch->mPlaybackThread->deletePatchTrack(patch->mPatchTrack);
536 patch->mPatchTrack.clear();
539 if (patch->mAudioPatch.num_sources != 2) {
540 audioflinger->closeOutputInternal_l(patch->mPlaybackThread);
542 patch->mPlaybackThread.clear();
546 /* Disconnect a patch */
569 struct audio_patch *patch = &removedPatch->mAudioPatch;
571 switch (patch->sources[0].type) {
573 audio_module_handle_t srcModule = patch->sources[0].ext.device.hw_module;
581 if (patch->sinks[0].type == AUDIO_PORT_TYPE_DEVICE &&
582 patch->sinks[0].ext.device.hw_module != srcModule) {
589 if (patch->sinks[0].type == AUDIO_PORT_TYPE_MIX) {
591 patch->sinks[0].ext.mix.handle);
594 patch->sinks[0].ext.mix.handle);
605 patch->sinks[0].ext.mix.handle);
608 patch->sinks[0].ext.mix.handle);
620 audio_module_handle_t srcModule = patch->sources[0].ext.mix.hw_module;
628 audioflinger->checkPlaybackThread_l(patch->sources[0].ext.mix.handle);
631 patch->sources[0].ext.mix.handle);