OSDN Git Service

original
[gb-231r1-is01/GB_2.3_IS01.git] / system / media / opensles / libopensles / IDeviceVolume.c
diff --git a/system/media/opensles/libopensles/IDeviceVolume.c b/system/media/opensles/libopensles/IDeviceVolume.c
new file mode 100644 (file)
index 0000000..346e5d8
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2010 The Android Open Source 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.
+ */
+
+/* DeviceVolume implementation */
+
+#include "sles_allinclusive.h"
+
+
+static SLresult IDeviceVolume_GetVolumeScale(SLDeviceVolumeItf self, SLuint32 deviceID,
+    SLint32 *pMinValue, SLint32 *pMaxValue, SLboolean *pIsMillibelScale)
+{
+    SL_ENTER_INTERFACE
+
+    switch (deviceID) {
+    case SL_DEFAULTDEVICEID_AUDIOINPUT:
+    case SL_DEFAULTDEVICEID_AUDIOOUTPUT:
+    case DEVICE_ID_HEADSET:
+    case DEVICE_ID_HANDSFREE:
+        if (NULL != pMinValue)
+            *pMinValue = 0;
+        if (NULL != pMaxValue)
+            *pMaxValue = 10;
+        if (NULL != pIsMillibelScale)
+            *pIsMillibelScale = SL_BOOLEAN_FALSE;
+        result = SL_RESULT_SUCCESS;
+        break;
+    default:
+        result = SL_RESULT_PARAMETER_INVALID;
+        break;
+    }
+
+    SL_LEAVE_INTERFACE
+}
+
+
+static SLresult IDeviceVolume_SetVolume(SLDeviceVolumeItf self, SLuint32 deviceID, SLint32 volume)
+{
+    SL_ENTER_INTERFACE
+
+    switch (deviceID) {
+    // These are treated same as generic audio output for now
+    case DEVICE_ID_HEADSET:
+    case DEVICE_ID_HANDSFREE:
+        deviceID = SL_DEFAULTDEVICEID_AUDIOOUTPUT;
+        // fall through
+    case SL_DEFAULTDEVICEID_AUDIOINPUT:
+    case SL_DEFAULTDEVICEID_AUDIOOUTPUT:
+        {
+        IDeviceVolume *this = (IDeviceVolume *) self;
+        interface_lock_poke(this);
+        this->mVolume[~deviceID] = volume;
+        interface_unlock_poke(this);
+        result = SL_RESULT_SUCCESS;
+        }
+        break;
+    default:
+        result = SL_RESULT_PARAMETER_INVALID;
+        break;
+    }
+
+    SL_LEAVE_INTERFACE
+}
+
+
+static SLresult IDeviceVolume_GetVolume(SLDeviceVolumeItf self, SLuint32 deviceID, SLint32 *pVolume)
+{
+    SL_ENTER_INTERFACE
+
+    if (NULL == pVolume) {
+        result = SL_RESULT_PARAMETER_INVALID;
+    } else {
+        switch (deviceID) {
+        // These are treated same as generic audio output for now
+        case DEVICE_ID_HEADSET:
+        case DEVICE_ID_HANDSFREE:
+            deviceID = SL_DEFAULTDEVICEID_AUDIOOUTPUT;
+            // fall through
+        case SL_DEFAULTDEVICEID_AUDIOINPUT:
+        case SL_DEFAULTDEVICEID_AUDIOOUTPUT:
+            {
+            IDeviceVolume *this = (IDeviceVolume *) self;
+            interface_lock_peek(this);
+            SLint32 volume = this->mVolume[~deviceID];
+            interface_unlock_peek(this);
+            *pVolume = volume;
+            result = SL_RESULT_SUCCESS;
+            }
+            break;
+        default:
+            result = SL_RESULT_PARAMETER_INVALID;
+            break;
+        }
+    }
+
+    SL_LEAVE_INTERFACE
+}
+
+
+static const struct SLDeviceVolumeItf_ IDeviceVolume_Itf = {
+    IDeviceVolume_GetVolumeScale,
+    IDeviceVolume_SetVolume,
+    IDeviceVolume_GetVolume
+};
+
+void IDeviceVolume_init(void *self)
+{
+    IDeviceVolume *this = (IDeviceVolume *) self;
+    this->mItf = &IDeviceVolume_Itf;
+    unsigned i;
+    for (i = 0; i < MAX_DEVICE; ++i) {
+        this->mVolume[i] = 10;
+    }
+}