blob: 480761f03e9f8c10dfea899eaaaac294be4a9f66 [file] [log] [blame]
vivek mehta2192bc92012-12-04 11:46:08 -08001/*
2** Copyright (c) 2012, The Linux Foundation. All rights reserved.
3** Not a Contribution, Apache license notifications and license are retained
4** for attribution purposes only.
5**
6** Copyright 2007, The Android Open Source Project
7**
8** Licensed under the Apache License, Version 2.0 (the "License");
9** you may not use this file except in compliance with the License.
10** You may obtain a copy of the License at
11**
12** http://www.apache.org/licenses/LICENSE-2.0
13**
14** Unless required by applicable law or agreed to in writing, software
15** distributed under the License is distributed on an "AS IS" BASIS,
16** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17** See the License for the specific language governing permissions and
18** limitations under the License.
19*/
20
21#define LOG_TAG "IDirectTrack"
22//#define LOG_NDEBUG 0
23#include <utils/Log.h>
24
25#include <stdint.h>
26#include <sys/types.h>
27
28#include <binder/Parcel.h>
29
30#include <media/IDirectTrack.h>
31
32namespace android {
33
34enum {
35 START = IBinder::FIRST_CALL_TRANSACTION,
36 STOP,
37 FLUSH,
38 MUTE,
39 PAUSE,
40 SET_VOLUME,
41 WRITE,
42 GET_TIMESTAMP
43};
44
45class BpDirectTrack : public BpInterface<IDirectTrack>
46{
47public:
48 BpDirectTrack(const sp<IBinder>& impl)
49 : BpInterface<IDirectTrack>(impl)
50 {
51 }
52
53 virtual status_t start()
54 {
55 Parcel data, reply;
56 data.writeInterfaceToken(IDirectTrack::getInterfaceDescriptor());
57 status_t status = remote()->transact(START, data, &reply);
58 if (status == NO_ERROR) {
59 status = reply.readInt32();
60 } else {
61 ALOGW("start() error: %s", strerror(-status));
62 }
63 return status;
64 }
65
66 virtual void stop()
67 {
68 Parcel data, reply;
69 data.writeInterfaceToken(IDirectTrack::getInterfaceDescriptor());
70 remote()->transact(STOP, data, &reply);
71 }
72
73 virtual void flush()
74 {
75 Parcel data, reply;
76 data.writeInterfaceToken(IDirectTrack::getInterfaceDescriptor());
77 remote()->transact(FLUSH, data, &reply);
78 }
79
80 virtual void mute(bool e)
81 {
82 Parcel data, reply;
83 data.writeInterfaceToken(IDirectTrack::getInterfaceDescriptor());
84 data.writeInt32(e);
85 remote()->transact(MUTE, data, &reply);
86 }
87
88 virtual void pause()
89 {
90 Parcel data, reply;
91 data.writeInterfaceToken(IDirectTrack::getInterfaceDescriptor());
92 remote()->transact(PAUSE, data, &reply);
93 }
94
95 virtual void setVolume(float left, float right)
96 {
97 Parcel data, reply;
98 data.writeInterfaceToken(IDirectTrack::getInterfaceDescriptor());
99 remote()->transact(SET_VOLUME, data, &reply);
100 }
101
102 virtual ssize_t write(const void* buffer, size_t bytes)
103 {
104 Parcel data, reply;
105 data.writeInterfaceToken(IDirectTrack::getInterfaceDescriptor());
106 ssize_t bytesWritten = remote()->transact(WRITE, data, &reply);
107 return bytesWritten;
108 }
109
110 virtual int64_t getTimeStamp() {
111 Parcel data, reply;
112 data.writeInterfaceToken(IDirectTrack::getInterfaceDescriptor());
113 int64_t tstamp = remote()->transact(GET_TIMESTAMP, data, &reply);
114 return tstamp;
115 }
116};
117
118IMPLEMENT_META_INTERFACE(DirectTrack, "android.media.IDirectTrack");
119
120// ----------------------------------------------------------------------
121
122status_t BnDirectTrack::onTransact(
123 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
124{
125 switch(code) {
126 case START: {
127 CHECK_INTERFACE(IDirectTrack, data, reply);
128 reply->writeInt32(start());
129 return NO_ERROR;
130 } break;
131 case STOP: {
132 CHECK_INTERFACE(IDirectTrack, data, reply);
133 stop();
134 return NO_ERROR;
135 } break;
136 case FLUSH: {
137 CHECK_INTERFACE(IDirectTrack, data, reply);
138 flush();
139 return NO_ERROR;
140 } break;
141 case MUTE: {
142 CHECK_INTERFACE(IDirectTrack, data, reply);
143 mute( data.readInt32() );
144 return NO_ERROR;
145 } break;
146 case PAUSE: {
147 CHECK_INTERFACE(IDirectTrack, data, reply);
148 pause();
149 return NO_ERROR;
150 }
151 case SET_VOLUME: {
152 CHECK_INTERFACE(IDirectTrack, data, reply);
153 float left = 1.0;
154 float right = 1.0;
155 setVolume(left, right);
156 return NO_ERROR;
157 }
158 case WRITE: {
159 CHECK_INTERFACE(IDirectTrack, data, reply);
160 const void *buffer = (void *)data.readInt32();
161 size_t bytes = data.readInt32();
162 ssize_t bytesWritten = write(buffer, bytes);
163 reply->writeInt32(bytesWritten);
164 return NO_ERROR;
165 }
166 case GET_TIMESTAMP: {
167 CHECK_INTERFACE(IDirectTrack, data, reply);
168 int64_t time = getTimeStamp();
169 reply->writeInt32(time);
170 return NO_ERROR;
171 }
172 default:
173 return BBinder::onTransact(code, data, reply, flags);
174 }
175}
176
177}; // namespace android
178