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