Lines Matching refs: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");
209 // - special patch request with 2 sources (reuse one existing output mix)
210 if ((patch->sinks[0].type == AUDIO_PORT_TYPE_DEVICE) &&
211 ((patch->sinks[0].ext.device.hw_module != srcModule) ||
213 (patch->num_sources == 2))) {
214 if (patch->num_sources == 2) {
215 if (patch->sources[1].type != AUDIO_PORT_TYPE_MIX ||
216 patch->sinks[0].ext.device.hw_module !=
217 patch->sources[1].ext.mix.hw_module) {
224 audioflinger->checkPlaybackThread_l(patch->sources[1].ext.mix.handle);
233 audio_devices_t device = patch->sinks[0].ext.device.type;
234 String8 address = String8(patch->sinks[0].ext.device.address);
237 patch->sinks[0].ext.device.hw_module,
251 audio_devices_t device = patch->sources[0].ext.device.type;
252 String8 address = String8(patch->sources[0].ext.device.address);
272 status = createPatchConnections(newPatch, patch);
277 if (patch->sinks[0].type == AUDIO_PORT_TYPE_MIX) {
279 patch->sinks[0].ext.mix.handle);
282 patch->sinks[0].ext.mix.handle);
286 status = thread->sendCreateAudioPatchConfigEvent(patch, &halHandle);
295 patch->num_sources,
296 patch->sources,
297 patch->num_sinks,
298 patch->sinks,
304 audio_module_handle_t srcModule = patch->sources[0].ext.mix.hw_module;
313 for (unsigned int i = 0; i < patch->num_sinks; i++) {
314 if (patch->sinks[i].type != AUDIO_PORT_TYPE_DEVICE) {
316 patch->sinks[i].type);
321 if (patch->sinks[i].ext.device.hw_module != srcModule) {
325 type |= patch->sinks[i].ext.device.type;
328 audioflinger->checkPlaybackThread_l(patch->sources[0].ext.mix.handle);
331 patch->sources[0].ext.mix.handle);
342 status = thread->sendCreateAudioPatchConfigEvent(patch, &halHandle);
355 ALOGV("createAudioPatch() added new patch handle %d halHandle %d", *handle, halHandle);
363 status_t AudioFlinger::PatchPanel::createPatchConnections(Patch *patch,
366 // create patch from source device to record thread input
372 patch->mRecordThread->getAudioPortConfig(&subPatch.sinks[0]);
375 status_t status = createAudioPatch(&subPatch, &patch->mRecordPatchHandle);
377 patch->mRecordPatchHandle = AUDIO_PATCH_HANDLE_NONE;
381 // create patch from playback thread output to sink device
382 patch->mPlaybackThread->getAudioPortConfig(&subPatch.sources[0]);
384 status = createAudioPatch(&subPatch, &patch->mPlaybackPatchHandle);
386 patch->mPlaybackPatchHandle = AUDIO_PATCH_HANDLE_NONE;
391 size_t playbackFrameCount = patch->mPlaybackThread->frameCount();
393 size_t recordFramecount = patch->mRecordThread->frameCount();
403 uint32_t channelCount = patch->mPlaybackThread->channelCount();
405 audio_channel_mask_t outChannelMask = patch->mPlaybackThread->channelMask();
406 uint32_t sampleRate = patch->mPlaybackThread->sampleRate();
407 audio_format_t format = patch->mPlaybackThread->format();
409 patch->mPatchRecord = new RecordThread::PatchRecord(
410 patch->mRecordThread.get(),
417 if (patch->mPatchRecord == 0) {
420 status = patch->mPatchRecord->initCheck();
424 patch->mRecordThread->addPatchRecord(patch->mPatchRecord);
428 patch->mPatchTrack = new PlaybackThread::PatchTrack(
429 patch->mPlaybackThread.get(),
435 patch->mPatchRecord->buffer(),
437 if (patch->mPatchTrack == 0) {
440 status = patch->mPatchTrack->initCheck();
444 patch->mPlaybackThread->addPatchTrack(patch->mPatchTrack);
447 patch->mPatchRecord->setPeerProxy(patch->mPatchTrack.get());
448 patch->mPatchTrack->setPeerProxy(patch->mPatchRecord.get());
451 patch->mPatchRecord->start(AudioSystem::SYNC_EVENT_NONE, 0);
452 patch->mPatchTrack->start();
457 void AudioFlinger::PatchPanel::clearPatchConnections(Patch *patch)
464 ALOGV("clearPatchConnections() patch->mRecordPatchHandle %d patch->mPlaybackPatchHandle %d",
465 patch->mRecordPatchHandle, patch->mPlaybackPatchHandle);
467 if (patch->mPatchRecord != 0) {
468 patch->mPatchRecord->stop();
470 if (patch->mPatchTrack != 0) {
471 patch->mPatchTrack->stop();
473 if (patch->mRecordPatchHandle != AUDIO_PATCH_HANDLE_NONE) {
474 releaseAudioPatch(patch->mRecordPatchHandle);
475 patch->mRecordPatchHandle = AUDIO_PATCH_HANDLE_NONE;
477 if (patch->mPlaybackPatchHandle != AUDIO_PATCH_HANDLE_NONE) {
478 releaseAudioPatch(patch->mPlaybackPatchHandle);
479 patch->mPlaybackPatchHandle = AUDIO_PATCH_HANDLE_NONE;
481 if (patch->mRecordThread != 0) {
482 if (patch->mPatchRecord != 0) {
483 patch->mRecordThread->deletePatchRecord(patch->mPatchRecord);
485 audioflinger->closeInputInternal_l(patch->mRecordThread);
487 if (patch->mPlaybackThread != 0) {
488 if (patch->mPatchTrack != 0) {
489 patch->mPlaybackThread->deletePatchTrack(patch->mPatchTrack);
492 if (patch->mAudioPatch.num_sources != 2) {
493 audioflinger->closeOutputInternal_l(patch->mPlaybackThread);
496 if (patch->mRecordThread != 0) {
497 if (patch->mPatchRecord != 0) {
498 patch->mPatchRecord.clear();
500 patch->mRecordThread.clear();
502 if (patch->mPlaybackThread != 0) {
503 if (patch->mPatchTrack != 0) {
504 patch->mPatchTrack.clear();
506 patch->mPlaybackThread.clear();
511 /* Disconnect a patch */
534 struct audio_patch *patch = &removedPatch->mAudioPatch;
536 switch (patch->sources[0].type) {
538 audio_module_handle_t srcModule = patch->sources[0].ext.device.hw_module;
552 if (patch->sinks[0].type == AUDIO_PORT_TYPE_MIX) {
554 patch->sinks[0].ext.mix.handle);
557 patch->sinks[0].ext.mix.handle);
573 audio_module_handle_t srcModule = patch->sources[0].ext.mix.hw_module;
581 audioflinger->checkPlaybackThread_l(patch->sources[0].ext.mix.handle);
584 patch->sources[0].ext.mix.handle);