summaryrefslogtreecommitdiffstats
path: root/src/org/cyanogenmod/audiofx/service/AudioOutputChangeListener.java
diff options
context:
space:
mode:
authorRoman Birg <roman@cyngn.com>2016-08-29 16:26:56 -0700
committerGerrit Code Review <gerrit@cyanogenmod.org>2016-08-29 16:26:56 -0700
commit33b5c82b68ecf8c18f284214b65db0c2e80589ce (patch)
tree41741e034f2057289f485f49761ebe6bc2135532 /src/org/cyanogenmod/audiofx/service/AudioOutputChangeListener.java
parent10fc11011278db3da38e3d28f729887426c1c3a1 (diff)
parent71e5da3c38e5a7e79d5c1f94a13f239cc7ca7458 (diff)
downloadandroid_packages_apps_AudioFX-33b5c82b68ecf8c18f284214b65db0c2e80589ce.tar.gz
android_packages_apps_AudioFX-33b5c82b68ecf8c18f284214b65db0c2e80589ce.tar.bz2
android_packages_apps_AudioFX-33b5c82b68ecf8c18f284214b65db0c2e80589ce.zip
Merge "AudioFX: finish rename; persist process" into cm-13.0
Diffstat (limited to 'src/org/cyanogenmod/audiofx/service/AudioOutputChangeListener.java')
-rw-r--r--src/org/cyanogenmod/audiofx/service/AudioOutputChangeListener.java145
1 files changed, 145 insertions, 0 deletions
diff --git a/src/org/cyanogenmod/audiofx/service/AudioOutputChangeListener.java b/src/org/cyanogenmod/audiofx/service/AudioOutputChangeListener.java
new file mode 100644
index 0000000..2b4cc20
--- /dev/null
+++ b/src/org/cyanogenmod/audiofx/service/AudioOutputChangeListener.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2016 The CyanogenMod Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.cyanogenmod.audiofx.service;
+
+import static android.media.AudioDeviceInfo.convertDeviceTypeToInternalDevice;
+
+import android.content.Context;
+import android.media.AudioDeviceCallback;
+import android.media.AudioDeviceInfo;
+import android.media.AudioManager;
+import android.os.Handler;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class AudioOutputChangeListener extends AudioDeviceCallback {
+
+ private static final String TAG = "AudioFx-" + AudioOutputChangeListener.class.getSimpleName();
+
+ private boolean mInitial = true;
+
+ private final Context mContext;
+ private final AudioManager mAudioManager;
+ private final Handler mHandler;
+ private int mLastDevice = -1;
+
+ private final ArrayList<AudioOutputChangedCallback> mCallbacks = new ArrayList<AudioOutputChangedCallback>();
+
+ public interface AudioOutputChangedCallback {
+ public void onAudioOutputChanged(boolean firstChange, AudioDeviceInfo outputDevice);
+ }
+
+ public AudioOutputChangeListener(Context context, Handler handler) {
+ mContext = context;
+ mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+ mHandler = handler;
+ }
+
+ public void addCallback(AudioOutputChangedCallback... callbacks) {
+ synchronized (mCallbacks) {
+ boolean initial = mCallbacks.size() == 0;
+ mCallbacks.addAll(Arrays.asList(callbacks));
+ if (initial) {
+ mAudioManager.registerAudioDeviceCallback(this, mHandler);
+ }
+ }
+ }
+
+ public void removeCallback(AudioOutputChangedCallback... callbacks) {
+ synchronized (mCallbacks) {
+ mCallbacks.removeAll(Arrays.asList(callbacks));
+ if (mCallbacks.size() == 0) {
+ mAudioManager.unregisterAudioDeviceCallback(this);
+ }
+ }
+ }
+
+ private void callback() {
+ synchronized (mCallbacks) {
+ final AudioDeviceInfo device = getCurrentDevice();
+
+ if (device == null) {
+ Log.w(TAG, "Unable to determine audio device!");
+ return;
+ }
+
+ if (mInitial || device.getId() != mLastDevice) {
+ Log.d(TAG, "onAudioOutputChanged id: " + device.getId() +
+ " type: " + device.getType() +
+ " name: " + device.getProductName() +
+ " address: " + device.getAddress() +
+ " [" + device.toString() + "]");
+ mLastDevice = device.getId();
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ synchronized (mCallbacks) {
+ for (AudioOutputChangedCallback callback : mCallbacks) {
+ callback.onAudioOutputChanged(mInitial, device);
+ }
+ }
+ }
+ });
+
+ if (mInitial) {
+ mInitial = false;
+ }
+ }
+ }
+ }
+
+ public void refresh() {
+ callback();
+ }
+
+ @Override
+ public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
+ callback();
+ }
+
+ @Override
+ public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
+ callback();
+ }
+
+ public List<AudioDeviceInfo> getConnectedOutputs() {
+ final List<AudioDeviceInfo> outputs = new ArrayList<AudioDeviceInfo>();
+ final int forMusic = mAudioManager.getDevicesForStream(AudioManager.STREAM_MUSIC);
+ for (AudioDeviceInfo ai : mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS)) {
+ if ((convertDeviceTypeToInternalDevice(ai.getType()) & forMusic) > 0) {
+ outputs.add(ai);
+ }
+ }
+ return outputs;
+ }
+
+ public AudioDeviceInfo getCurrentDevice() {
+ final List<AudioDeviceInfo> devices = getConnectedOutputs();
+ return devices.size() > 0 ? devices.get(0) : null;
+ }
+
+ public AudioDeviceInfo getDeviceById(int id) {
+ for (AudioDeviceInfo ai : mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS)) {
+ if (ai.getId() == id) {
+ return ai;
+ }
+ }
+ return null;
+ }
+}