189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* 289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Copyright (C) 2009 The Android Open Source Project 389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * you may not use this file except in compliance with the License. 689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * You may obtain a copy of the License at 789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * See the License for the specific language governing permissions and 1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * limitations under the License. 1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "IAudioFlingerClient" 1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Log.h> 1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdint.h> 2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/types.h> 2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 237562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/Parcel.h> 2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IAudioFlingerClient.h> 26c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <media/AudioSystem.h> 2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android { 2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum { 31c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent IO_CONFIG_CHANGED = IBinder::FIRST_CALL_TRANSACTION 3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlingerClient : public BpInterface<IAudioFlingerClient> 3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic: 3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project BpAudioFlingerClient(const sp<IBinder>& impl) 3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project : BpInterface<IAudioFlingerClient>(impl) 3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 42b81cc8c6f3eec9edb255ea99b6a6f243585b1e38Glenn Kasten void ioConfigChanged(int event, audio_io_handle_t ioHandle, const void *param2) 4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlingerClient::getInterfaceDescriptor()); 46c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(event); 4772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 48c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (event == AudioSystem::STREAM_CONFIG_CHANGED) { 49b81cc8c6f3eec9edb255ea99b6a6f243585b1e38Glenn Kasten uint32_t stream = *(const uint32_t *)param2; 503856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ioConfigChanged stream %d", stream); 51c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(stream); 52c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } else if (event != AudioSystem::OUTPUT_CLOSED && event != AudioSystem::INPUT_CLOSED) { 5385ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten const AudioSystem::OutputDescriptor *desc = 5485ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten (const AudioSystem::OutputDescriptor *)param2; 55c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(desc->samplingRate); 56c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(desc->format); 57fad226abd12435dbcd232f7de396f1a097b2bd5fGlenn Kasten data.writeInt32(desc->channelMask); 58e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten data.writeInt64(desc->frameCount); 59c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(desc->latency); 60c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 61c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(IO_CONFIG_CHANGED, data, &reply, IBinder::FLAG_ONEWAY); 6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlingerClient, "android.media.IAudioFlingerClient"); 6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------- 6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlingerClient::onTransact( 7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 72e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten switch (code) { 73c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case IO_CONFIG_CHANGED: { 7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlingerClient, data, reply); 75c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int event = data.readInt32(); 7672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 77b81cc8c6f3eec9edb255ea99b6a6f243585b1e38Glenn Kasten const void *param2 = NULL; 78c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent AudioSystem::OutputDescriptor desc; 79c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t stream; 80c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (event == AudioSystem::STREAM_CONFIG_CHANGED) { 81c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent stream = data.readInt32(); 82c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent param2 = &stream; 833856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("STREAM_CONFIG_CHANGED stream %d", stream); 84c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } else if (event != AudioSystem::OUTPUT_CLOSED && event != AudioSystem::INPUT_CLOSED) { 85c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent desc.samplingRate = data.readInt32(); 86eced2daaa6c91a3731eef978ce65c6ec319c5e6aGlenn Kasten desc.format = (audio_format_t) data.readInt32(); 87fad226abd12435dbcd232f7de396f1a097b2bd5fGlenn Kasten desc.channelMask = (audio_channel_mask_t) data.readInt32(); 88e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten desc.frameCount = data.readInt64(); 89c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent desc.latency = data.readInt32(); 90c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent param2 = &desc; 91c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 92fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent ioConfigChanged(event, ioHandle, param2); 9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------------- 10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android 103