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

Commit 77080983 authored by StevenHarperUK's avatar StevenHarperUK Committed by Steve Kondik
Browse files

Added support for a fourth audio device - dock

Adding persistant setting to choose to use usb audio

Change-Id: I3860c04c8f14e8e98d79d82a354a92b78565c3d1
parent 4a56820c
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -1972,6 +1972,12 @@ public final class Settings {
         */
        public static final String POWER_SOUNDS_ENABLED = "power_sounds_enabled";

        /**
         * Whether to route USB Audio when docked.
         * @hide
         */
        public static final String DOCK_USB_AUDIO_ENABLED = "dock_usb_audio_enabled";

        /**
         * Whether to play a sound for dock events.
         * @hide
+7 −2
Original line number Diff line number Diff line
@@ -2638,12 +2638,17 @@ public class AudioService extends IAudioService.Stub {
                                                        "");
                        mConnectedDevices.remove(AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET);
                    } else if (state == 1 && !isConnected)  {
                        // Only Route the Audio if enabled in Dock Settings
                        if (Settings.System.getInt(mContentResolver,Settings.System.DOCK_USB_AUDIO_ENABLED, 0) == 1) {
                            AudioSystem.setDeviceConnectionState(
                                                        AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET,
                                                        AudioSystem.DEVICE_STATE_AVAILABLE,
                                                        "");
                            mConnectedDevices.put(
                                new Integer(AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET), "");
                        } else {
                            Log.v(TAG, "Broadcast Receiver: Not using USB audio by request");
                        }
                    }
                }
            } else if (action.equals(Intent.ACTION_HDMI_AUDIO_PLUG)) {
+1 −0
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@
    <!-- user interface sound effects -->
    <integer name="def_power_sounds_enabled">1</integer>
    <string name="def_low_battery_sound" translatable="false">/system/media/audio/ui/LowBattery.ogg</string>
    <integer name="def_dock_usb_audio_enabled">0</integer>
    <integer name="def_dock_sounds_enabled">0</integer>
    <string name="def_desk_dock_sound" translatable="false">/system/media/audio/ui/Dock.ogg</string>
    <string name="def_desk_undock_sound" translatable="false">/system/media/audio/ui/Undock.ogg</string>
+2 −0
Original line number Diff line number Diff line
@@ -1415,6 +1415,8 @@ public class DatabaseHelper extends SQLiteOpenHelper {
        loadBooleanSetting(stmt, Settings.System.HAPTIC_FEEDBACK_ENABLED,
                R.bool.def_haptic_feedback);

        loadIntegerSetting(stmt, Settings.System.DOCK_USB_AUDIO_ENABLED,
            R.integer.def_dock_usb_audio_enabled);
        loadIntegerSetting(stmt, Settings.System.DOCK_SOUNDS_ENABLED,
            R.integer.def_dock_sounds_enabled);
        loadStringSetting(stmt, Settings.System.DESK_DOCK_SOUND,
+16 −3
Original line number Diff line number Diff line
@@ -39,10 +39,13 @@ import java.io.FileNotFoundException;
class WiredAccessoryObserver extends UEventObserver {
    private static final String TAG = WiredAccessoryObserver.class.getSimpleName();
    private static final boolean LOG = true;
    private static final int MAX_AUDIO_PORTS = 3; /* h2w, USB Audio & hdmi */
    private static final int MAX_AUDIO_PORTS = 4; /* h2w, dock, USB Audio & hdmi */
    private static final String uEventInfo[][] = { {"DEVPATH=/devices/virtual/switch/h2w",
                                                    "/sys/class/switch/h2w/state",
                                                    "/sys/class/switch/h2w/name"},
                                                   {"DEVPATH=/devices/virtual/switch/dock",
                                                    "/sys/class/switch/dock/state",
                                                    "/sys/class/switch/dock/name"},
                                                   {"DEVPATH=/devices/virtual/switch/usb_audio",
                                                    "/sys/class/switch/usb_audio/state",
                                                    "/sys/class/switch/usb_audio/name"},
@@ -106,10 +109,21 @@ class WiredAccessoryObserver extends UEventObserver {

    private synchronized final void updateState(String name, int state)
    {
        if (LOG) Slog.v(TAG, "updateState name: " + name + " state " + state);
        if (name.equals("usb_audio")) {
            switchState = ((mHeadsetState & (BIT_HEADSET|BIT_HEADSET_NO_MIC|BIT_HDMI_AUDIO)) |
                           ((state == 1) ? BIT_USB_HEADSET_ANLG :
                                         ((state == 2) ? BIT_USB_HEADSET_DGTL : 0)));
        } else if (name.equals("dock")) {
             switchState = ((mHeadsetState & (BIT_HEADSET|BIT_HEADSET_NO_MIC|BIT_HDMI_AUDIO)) |
                           ((state == 2) ? BIT_USB_HEADSET_ANLG : 0));
            // This sets the switchsate to 4 (for USB HEADSET - BIT_USB_HEADSET_ANLG)
            // Looking at the other types, maybe the state that emitted should be a 1 and at 
            //       /devices/virtual/switch/usb_audio
            //
            // However the we need to deal with changes at
            //       /devices/virtual/switch/dock
            // for this the state of 2 - means that we have a USB ANLG headset
        } else if (name.equals("hdmi")) {
            switchState = ((mHeadsetState & (BIT_HEADSET|BIT_HEADSET_NO_MIC|
                                             BIT_USB_HEADSET_DGTL|BIT_USB_HEADSET_ANLG)) |
@@ -124,6 +138,7 @@ class WiredAccessoryObserver extends UEventObserver {
                            ((state == 1) ? BIT_HEADSET :
                                          ((state == 2) ? BIT_HEADSET_NO_MIC : 0)));
        }
        if (LOG) Slog.v(TAG, "updateState switchState: " + switchState);
        update(name, switchState);
    }

@@ -230,7 +245,6 @@ class WiredAccessoryObserver extends UEventObserver {

    private final void sendIntent(int headset, int headsetState, int prevHeadsetState, String headsetName) {
        if ((headsetState & headset) != (prevHeadsetState & headset)) {

            int state = 0;
            if ((headsetState & headset) != 0) {
                state = 1;
@@ -238,7 +252,6 @@ class WiredAccessoryObserver extends UEventObserver {
            if((headset == BIT_USB_HEADSET_ANLG) || (headset == BIT_USB_HEADSET_DGTL) ||
               (headset == BIT_HDMI_AUDIO)) {
                Intent intent;

                //  Pack up the values and broadcast them to everyone
                if (headset == BIT_USB_HEADSET_ANLG) {
                    intent = new Intent(Intent.ACTION_USB_ANLG_HEADSET_PLUG);