blob: 9ede0203ba8c47149dc43c6ada40898197dc0ab6 [file] [log] [blame]
Eric Laurent4e090692015-03-05 15:12:40 -08001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_HARDWARE_RADIO_SERVICE_H
18#define ANDROID_HARDWARE_RADIO_SERVICE_H
19
20#include <utils/Vector.h>
21//#include <binder/AppOpsManager.h>
22#include <binder/MemoryDealer.h>
23#include <binder/BinderService.h>
24#include <binder/IAppOpsCallback.h>
25#include <radio/IRadioService.h>
26#include <radio/IRadio.h>
27#include <radio/IRadioClient.h>
28#include <system/radio.h>
29#include <hardware/radio.h>
30
31namespace android {
32
33class MemoryHeapBase;
34
35class RadioService :
36 public BinderService<RadioService>,
37 public BnRadioService
38{
39 friend class BinderService<RadioService>;
40
41public:
42 class ModuleClient;
43 class Module;
44
45 static char const* getServiceName() { return "media.radio"; }
46
47 RadioService();
48 virtual ~RadioService();
49
50 // IRadioService
51 virtual status_t listModules(struct radio_properties *properties,
52 uint32_t *numModules);
53
54 virtual status_t attach(radio_handle_t handle,
55 const sp<IRadioClient>& client,
56 const struct radio_band_config *config,
57 bool withAudio,
58 sp<IRadio>& radio);
59
60 virtual status_t onTransact(uint32_t code, const Parcel& data,
61 Parcel* reply, uint32_t flags);
62
63 virtual status_t dump(int fd, const Vector<String16>& args);
64
65
66 class Module : public virtual RefBase {
67 public:
68
69 Module(const sp<RadioService>& service,
70 radio_hw_device* hwDevice,
71 struct radio_properties properties);
72
73 virtual ~Module();
74
75 sp<ModuleClient> addClient(const sp<IRadioClient>& client,
76 const struct radio_band_config *config,
77 bool audio);
78
79 void removeClient(const sp<ModuleClient>& moduleClient);
80
81 status_t setMute(bool mute);
82
83 status_t getMute(bool *mute);
84
85 virtual status_t dump(int fd, const Vector<String16>& args);
86
87 const struct radio_hw_device *hwDevice() const { return mHwDevice; }
88 const struct radio_properties properties() const { return mProperties; }
89 const struct radio_band_config *getDefaultConfig() const ;
90
91 wp<RadioService> service() const { return mService; }
92
93 private:
94
95 Mutex mLock;
96 wp<RadioService> mService;
97 const struct radio_hw_device *mHwDevice;
98 const struct radio_properties mProperties;
99 Vector< sp<ModuleClient> > mModuleClients;
100 bool mMute;
101 }; // class Module
102
103 class CallbackThread : public Thread {
104 public:
105
106 CallbackThread(const wp<ModuleClient>& moduleClient);
107
108 virtual ~CallbackThread();
109
110
111 // Thread virtuals
112 virtual bool threadLoop();
113
114 // RefBase
115 virtual void onFirstRef();
116
117 void exit();
118
119 void sendEvent(radio_hal_event_t *halEvent);
120 sp<IMemory> prepareEvent(radio_hal_event_t *halEvent);
121
122 private:
123 wp<ModuleClient> mModuleClient;
124 Condition mCallbackCond;
125 Mutex mCallbackLock;
126 Vector< sp<IMemory> > mEventQueue;
127 sp<MemoryDealer> mMemoryDealer;
128 }; // class CallbackThread
129
130 class ModuleClient : public BnRadio,
131 public IBinder::DeathRecipient {
132 public:
133
134 ModuleClient(const sp<Module>& module,
135 const sp<IRadioClient>& client,
136 const struct radio_band_config *config,
137 bool audio);
138
139 virtual ~ModuleClient();
140
141 // IRadio
142 virtual void detach();
143
144 virtual status_t setConfiguration(const struct radio_band_config *config);
145
146 virtual status_t getConfiguration(struct radio_band_config *config);
147
148 virtual status_t setMute(bool mute);
149
150 virtual status_t getMute(bool *mute);
151
152 virtual status_t scan(radio_direction_t direction, bool skipSubChannel);
153
154 virtual status_t step(radio_direction_t direction, bool skipSubChannel);
155
156 virtual status_t tune(unsigned int channel, unsigned int subChannel);
157
158 virtual status_t cancel();
159
160 virtual status_t getProgramInformation(struct radio_program_info *info);
161
162 virtual status_t hasControl(bool *hasControl);
163
164 virtual status_t dump(int fd, const Vector<String16>& args);
165
166 sp<IRadioClient> client() const { return mClient; }
167 wp<Module> module() const { return mModule; }
168 radio_hal_band_config_t halConfig() const;
169 sp<CallbackThread> callbackThread() const { return mCallbackThread; }
170 void setTuner(const struct radio_tuner *tuner);
171 const struct radio_tuner *getTuner() const;
172 bool audio() const { return mAudio; }
173
174 void onCallbackEvent(const sp<IMemory>& event);
175
176 virtual void onFirstRef();
177
178
179 // IBinder::DeathRecipient implementation
180 virtual void binderDied(const wp<IBinder> &who);
181
182 private:
183
184 mutable Mutex mLock;
185 wp<Module> mModule;
186 sp<IRadioClient> mClient;
187 radio_band_config_t mConfig;
188 sp<CallbackThread> mCallbackThread;
189 const bool mAudio;
190 const struct radio_tuner *mTuner;
191 }; // class ModuleClient
192
193
194 static void callback(radio_hal_event_t *halEvent, void *cookie);
195
196private:
197
198 virtual void onFirstRef();
199
200 static void convertProperties(radio_properties_t *properties,
201 const radio_hal_properties_t *halProperties);
202 Mutex mServiceLock;
203 volatile int32_t mNextUniqueId;
204 DefaultKeyedVector< radio_handle_t, sp<Module> > mModules;
205};
206
207} // namespace android
208
209#endif // ANDROID_HARDWARE_RADIO_SERVICE_H