Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cf817a23 authored by Eric Laurent's avatar Eric Laurent
Browse files

audio: fix crashes upon USB device connection

- Audio policy:
Replace unknown device assertion by debug log in setDeviceConnectionState().
It is possible that some kernels indicate connection of a legacy device type
when a USB audio device is connected.
We should just ignore this device.

- Audio flinger:
Make sure FastMixer thread is idle before exiting the normal mixer thread and
closing the output stream.

Change-Id: Ia10a20176a60a8aa56765538093a555fc998508a
parent e4671134
Loading
Loading
Loading
Loading
+3 −6
Original line number Diff line number Diff line
@@ -2639,12 +2639,9 @@ bool AudioFlinger::PlaybackThread::threadLoop()

    threadLoop_exit();

    // for DuplicatingThread, standby mode is handled by the outputTracks, otherwise ...
    if (mType == MIXER || mType == DIRECT || mType == OFFLOAD) {
        // put output stream into standby mode
    if (!mStandby) {
            mOutput->stream->common.standby(&mOutput->stream->common);
        }
        threadLoop_standby();
        mStandby = true;
    }

    releaseWakeLock();
+7 −3
Original line number Diff line number Diff line
@@ -239,10 +239,14 @@ status_t AudioPolicyManager::setDeviceConnectionState(audio_devices_t device,
            // register new device as available
            index = mAvailableOutputDevices.add(devDesc);
            if (index >= 0) {
                mAvailableOutputDevices[index]->mId = nextUniqueId();
                sp<HwModule> module = getModuleForDevice(device);
                ALOG_ASSERT(module != NULL, "setDeviceConnectionState():"
                        "could not find HW module for device %08x", device);
                if (module == 0) {
                    ALOGD("setDeviceConnectionState() could not find HW module for device %08x",
                          device);
                    mAvailableOutputDevices.remove(devDesc);
                    return INVALID_OPERATION;
                }
                mAvailableOutputDevices[index]->mId = nextUniqueId();
                mAvailableOutputDevices[index]->mModule = module;
            } else {
                return NO_MEMORY;