IAudioRecord.cpp revision 34f1d8ecd23169a5f299937e3aaf1bd7937578a0
1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*
2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard**
3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard** Copyright 2007, The Android Open Source Project
4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard**
5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard** Licensed under the Apache License, Version 2.0 (the "License");
6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard** you may not use this file except in compliance with the License.
7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard** You may obtain a copy of the License at
8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard**
9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard**     http://www.apache.org/licenses/LICENSE-2.0
10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard**
11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard** Unless required by applicable law or agreed to in writing, software
12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard** distributed under the License is distributed on an "AS IS" BASIS,
13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard** See the License for the specific language governing permissions and
15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard** limitations under the License.
16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/
17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define LOG_TAG "IAudioRecord"
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//#define LOG_NDEBUG 0
20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <utils/Log.h>
21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <stdint.h>
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <sys/types.h>
24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <binder/Parcel.h>
26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <media/IAudioRecord.h>
28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardnamespace android {
30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardenum {
32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    GET_CBLK = IBinder::FIRST_CALL_TRANSACTION,
33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    START,
34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    STOP
35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard};
36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardclass BpAudioRecord : public BpInterface<IAudioRecord>
38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardpublic:
40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    BpAudioRecord(const sp<IBinder>& impl)
41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        : BpInterface<IAudioRecord>(impl)
42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    virtual status_t start()
46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        Parcel data, reply;
48b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        data.writeInterfaceToken(IAudioRecord::getInterfaceDescriptor());
49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        status_t status = remote()->transact(START, data, &reply);
50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (status == NO_ERROR) {
51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            status = reply.readInt32();
52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        } else {
53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            LOGW("start() error: %s", strerror(-status));
54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        return status;
56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    virtual void stop()
59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        Parcel data, reply;
61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        data.writeInterfaceToken(IAudioRecord::getInterfaceDescriptor());
62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        remote()->transact(STOP, data, &reply);
63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    virtual sp<IMemory> getCblk() const
66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        Parcel data, reply;
68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        sp<IMemory> cblk;
69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        data.writeInterfaceToken(IAudioRecord::getInterfaceDescriptor());
70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        status_t status = remote()->transact(GET_CBLK, data, &reply);
71b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        if (status == NO_ERROR) {
72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            cblk = interface_cast<IMemory>(reply.readStrongBinder());
73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        return cblk;
75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard};
77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
78e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardIMPLEMENT_META_INTERFACE(AudioRecord, "android.media.IAudioRecord");
79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// ----------------------------------------------------------------------
81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatus_t BnAudioRecord::onTransact(
83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    switch(code) {
86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard       case GET_CBLK: {
87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            CHECK_INTERFACE(IAudioRecord, data, reply);
88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            reply->writeStrongBinder(getCblk()->asBinder());
89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            return NO_ERROR;
90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        } break;
91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        case START: {
92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            CHECK_INTERFACE(IAudioRecord, data, reply);
93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            reply->writeInt32(start());
94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            return NO_ERROR;
95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        } break;
96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        case STOP: {
97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            CHECK_INTERFACE(IAudioRecord, data, reply);
98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            stop();
99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            return NO_ERROR;
100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        } break;
101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        default:
102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            return BBinder::onTransact(code, data, reply, flags);
103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}; // namespace android
107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard