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,
145 if (handle == NULL || patch == NULL) {
149 patch->num_sources, patch->num_sinks, *handle);
154 if (patch->num_sources == 0 || patch->num_sources > AUDIO_PATCH_PORTS_MAX ||
155 (patch->num_sinks == 0 && patch->num_sources != 2) ||
156 patch->num_sinks > AUDIO_PATCH_PORTS_MAX) {
160 // only the audio policy manager can request a patch creation with 2 sources.
161 if (patch->num_sources > 2) {
168 ALOGV("createAudioPatch() removing patch handle %d", *handle);
184 Patch *newPatch = new Patch(patch);
186 switch (patch->sources[0].type) {
188 audio_module_handle_t srcModule = patch->sources[0].ext.device.hw_module;
196 for (unsigned int i = 0; i < patch->num_sinks; i++) {
198 if ((patch->sinks[i].type == AUDIO_PORT_TYPE_MIX ||
199 patch->sinks[i].ext.mix.hw_module != srcModule) &&
200 patch->num_sinks > 1) {
205 if (patch->sinks[i].type != patch->sinks[0].type) {
206 ALOGW("createAudioPatch() different sink types in same patch not supported");
213 // - special patch request with 2 sources (reuse one existing output mix) OR
217 if ((patch->num_sources == 2) ||
218 ((patch->sinks[0].type == AUDIO_PORT_TYPE_DEVICE) &&
219 ((patch->sinks[0].ext.device.hw_module != srcModule) ||
221 if (patch->num_sources == 2) {
222 if (patch->sources[1].type != AUDIO_PORT_TYPE_MIX ||
223 (patch->num_sinks != 0 && patch->sinks[0].ext.device.hw_module !=
224 patch->sources[1].ext.mix.hw_module)) {
231 audioflinger->checkPlaybackThread_l(patch->sources[1].ext.mix.handle);
240 audio_devices_t device = patch->sinks[0].ext.device.type;
241 String8 address = String8(patch->sinks[0].ext.device.address);
244 patch->sinks[0].ext.device.hw_module,
257 audio_devices_t device = patch->sources[0].ext.device.type;
258 String8 address = String8(patch->sources[0].ext.device.address);
262 if (patch->sources[0].config_mask & AUDIO_PORT_CONFIG_SAMPLE_RATE) {
263 config.sample_rate = patch->sources[0].sample_rate;
267 if (patch->sources[0].config_mask & AUDIO_PORT_CONFIG_CHANNEL_MASK) {
268 config.channel_mask = patch->sources[0].channel_mask;
273 if (patch->sources[0].config_mask & AUDIO_PORT_CONFIG_FORMAT) {
274 config.format = patch->sources[0].format;
292 status = createPatchConnections(newPatch, patch);
297 if (patch->sinks[0].type == AUDIO_PORT_TYPE_MIX) {
299 patch->sinks[0].ext.mix.handle);
302 patch->sinks[0].ext.mix.handle);
306 status = thread->sendCreateAudioPatchConfigEvent(patch, &halHandle);
315 patch->num_sources,
316 patch->sources,
317 patch->num_sinks,
318 patch->sinks,
324 audio_module_handle_t srcModule = patch->sources[0].ext.mix.hw_module;
333 for (unsigned int i = 0; i < patch->num_sinks; i++) {
334 if (patch->sinks[i].type != AUDIO_PORT_TYPE_DEVICE) {
336 patch->sinks[i].type);
341 if (patch->sinks[i].ext.device.hw_module != srcModule) {
345 type |= patch->sinks[i].ext.device.type;
348 audioflinger->checkPlaybackThread_l(patch->sources[0].ext.mix.handle);
351 patch->sources[0].ext.mix.handle);
362 status = thread->sendCreateAudioPatchConfigEvent(patch, &halHandle);
375 ALOGV("createAudioPatch() added new patch handle %d halHandle %d", *handle, halHandle);
383 status_t AudioFlinger::PatchPanel::createPatchConnections(Patch *patch,
386 // create patch from source device to record thread input
392 patch->mRecordThread->getAudioPortConfig(&subPatch.sinks[0]);
395 status_t status = createAudioPatch(&subPatch, &patch->mRecordPatchHandle);
397 patch->mRecordPatchHandle = AUDIO_PATCH_HANDLE_NONE;
401 // create patch from playback thread output to sink device
403 patch->mPlaybackThread->getAudioPortConfig(&subPatch.sources[0]);
405 status = createAudioPatch(&subPatch, &patch->mPlaybackPatchHandle);
407 patch->mPlaybackPatchHandle = AUDIO_PATCH_HANDLE_NONE;
411 patch->mPlaybackPatchHandle = AUDIO_PATCH_HANDLE_NONE;
415 size_t playbackFrameCount = patch->mPlaybackThread->frameCount();
417 size_t recordFramecount = patch->mRecordThread->frameCount();
427 uint32_t channelCount = patch->mPlaybackThread->channelCount();
429 audio_channel_mask_t outChannelMask = patch->mPlaybackThread->channelMask();
430 uint32_t sampleRate = patch->mPlaybackThread->sampleRate();
431 audio_format_t format = patch->mPlaybackThread->format();
433 patch->mPatchRecord = new RecordThread::PatchRecord(
434 patch->mRecordThread.get(),
441 if (patch->mPatchRecord == 0) {
444 status = patch->mPatchRecord->initCheck();
448 patch->mRecordThread->addPatchRecord(patch->mPatchRecord);
452 patch->mPatchTrack = new PlaybackThread::PatchTrack(
453 patch->mPlaybackThread.get(),
459 patch->mPatchRecord->buffer(),
461 if (patch->mPatchTrack == 0) {
464 status = patch->mPatchTrack->initCheck();
468 patch->mPlaybackThread->addPatchTrack(patch->mPatchTrack);
471 patch->mPatchRecord->setPeerProxy(patch->mPatchTrack.get());
472 patch->mPatchTrack->setPeerProxy(patch->mPatchRecord.get());
475 patch->mPatchRecord->start(AudioSystem::SYNC_EVENT_NONE, AUDIO_SESSION_NONE);
476 patch->mPatchTrack->start();
481 void AudioFlinger::PatchPanel::clearPatchConnections(Patch *patch)
488 ALOGV("clearPatchConnections() patch->mRecordPatchHandle %d patch->mPlaybackPatchHandle %d",
489 patch->mRecordPatchHandle, patch->mPlaybackPatchHandle);
491 if (patch->mPatchRecord != 0) {
492 patch->mPatchRecord->stop();
494 if (patch->mPatchTrack != 0) {
495 patch->mPatchTrack->stop();
497 if (patch->mRecordPatchHandle != AUDIO_PATCH_HANDLE_NONE) {
498 releaseAudioPatch(patch->mRecordPatchHandle);
499 patch->mRecordPatchHandle = AUDIO_PATCH_HANDLE_NONE;
501 if (patch->mPlaybackPatchHandle != AUDIO_PATCH_HANDLE_NONE) {
502 releaseAudioPatch(patch->mPlaybackPatchHandle);
503 patch->mPlaybackPatchHandle = AUDIO_PATCH_HANDLE_NONE;
505 if (patch->mRecordThread != 0) {
506 if (patch->mPatchRecord != 0) {
507 patch->mRecordThread->deletePatchRecord(patch->mPatchRecord);
509 audioflinger->closeInputInternal_l(patch->mRecordThread);
511 if (patch->mPlaybackThread != 0) {
512 if (patch->mPatchTrack != 0) {
513 patch->mPlaybackThread->deletePatchTrack(patch->mPatchTrack);
516 if (patch->mAudioPatch.num_sources != 2) {
517 audioflinger->closeOutputInternal_l(patch->mPlaybackThread);
520 if (patch->mRecordThread != 0) {
521 if (patch->mPatchRecord != 0) {
522 patch->mPatchRecord.clear();
524 patch->mRecordThread.clear();
526 if (patch->mPlaybackThread != 0) {
527 if (patch->mPatchTrack != 0) {
528 patch->mPatchTrack.clear();
530 patch->mPlaybackThread.clear();
535 /* Disconnect a patch */
558 struct audio_patch *patch = &removedPatch->mAudioPatch;
560 switch (patch->sources[0].type) {
562 audio_module_handle_t srcModule = patch->sources[0].ext.device.hw_module;
576 if (patch->sinks[0].type == AUDIO_PORT_TYPE_MIX) {
578 patch->sinks[0].ext.mix.handle);
581 patch->sinks[0].ext.mix.handle);
597 audio_module_handle_t srcModule = patch->sources[0].ext.mix.hw_module;
605 audioflinger->checkPlaybackThread_l(patch->sources[0].ext.mix.handle);
608 patch->sources[0].ext.mix.handle);