• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 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 #pragma once
18 
19 #include "VirtualRadio.h"
20 
21 #include <aidl/android/hardware/broadcastradio/AmFmBandRange.h>
22 #include <aidl/android/hardware/broadcastradio/AmFmRegionConfig.h>
23 #include <aidl/android/hardware/broadcastradio/AnnouncementType.h>
24 #include <aidl/android/hardware/broadcastradio/BnBroadcastRadio.h>
25 #include <aidl/android/hardware/broadcastradio/DabTableEntry.h>
26 #include <aidl/android/hardware/broadcastradio/IAnnouncementListener.h>
27 #include <aidl/android/hardware/broadcastradio/ICloseHandle.h>
28 #include <aidl/android/hardware/broadcastradio/ITunerCallback.h>
29 #include <aidl/android/hardware/broadcastradio/Properties.h>
30 #include <broadcastradio-utils/WorkerThread.h>
31 
32 #include <android-base/thread_annotations.h>
33 
34 #include <optional>
35 
36 namespace aidl::android::hardware::broadcastradio {
37 
38 class BroadcastRadio final : public BnBroadcastRadio {
39   public:
40     explicit BroadcastRadio(const VirtualRadio& virtualRadio);
41     ~BroadcastRadio();
42     ndk::ScopedAStatus getAmFmRegionConfig(bool full, AmFmRegionConfig* returnConfigs)
43             EXCLUDES(mMutex) override;
44     ndk::ScopedAStatus getDabRegionConfig(std::vector<DabTableEntry>* returnConfigs) override;
45     ndk::ScopedAStatus getImage(int32_t id, std::vector<uint8_t>* returnImage) override;
46     ndk::ScopedAStatus getProperties(Properties* returnProperties) EXCLUDES(mMutex) override;
47 
48     ndk::ScopedAStatus setTunerCallback(const std::shared_ptr<ITunerCallback>& callback)
49             EXCLUDES(mMutex) override;
50     ndk::ScopedAStatus unsetTunerCallback() EXCLUDES(mMutex) override;
51     ndk::ScopedAStatus tune(const ProgramSelector& program) EXCLUDES(mMutex) override;
52     ndk::ScopedAStatus seek(bool directionUp, bool skipSubChannel) EXCLUDES(mMutex) override;
53     ndk::ScopedAStatus step(bool directionUp) EXCLUDES(mMutex) override;
54     ndk::ScopedAStatus cancel() EXCLUDES(mMutex) override;
55     ndk::ScopedAStatus startProgramListUpdates(const ProgramFilter& filter)
56             EXCLUDES(mMutex) override;
57     ndk::ScopedAStatus stopProgramListUpdates() EXCLUDES(mMutex) override;
58     ndk::ScopedAStatus isConfigFlagSet(ConfigFlag flag, bool* returnIsSet)
59             EXCLUDES(mMutex) override;
60     ndk::ScopedAStatus setConfigFlag(ConfigFlag flag, bool in_value) EXCLUDES(mMutex) override;
61     ndk::ScopedAStatus setParameters(const std::vector<VendorKeyValue>& parameters,
62                                      std::vector<VendorKeyValue>* returnParameters) override;
63     ndk::ScopedAStatus getParameters(const std::vector<std::string>& keys,
64                                      std::vector<VendorKeyValue>* returnParameters) override;
65     ndk::ScopedAStatus registerAnnouncementListener(
66             const std::shared_ptr<IAnnouncementListener>& listener,
67             const std::vector<AnnouncementType>& enabled,
68             std::shared_ptr<ICloseHandle>* returnCloseHandle) override;
69     binder_status_t dump(int fd, const char** args, uint32_t numArgs) EXCLUDES(mMutex) override;
70 
71   private:
72     const VirtualRadio& mVirtualRadio;
73     std::mutex mMutex;
74     AmFmRegionConfig mAmFmConfig GUARDED_BY(mMutex);
75     std::unique_ptr<::android::WorkerThread> mTuningThread GUARDED_BY(mMutex) =
76             std::unique_ptr<::android::WorkerThread>(new ::android::WorkerThread());
77     std::unique_ptr<::android::WorkerThread> mProgramListThread GUARDED_BY(mMutex) =
78             std::unique_ptr<::android::WorkerThread>(new ::android::WorkerThread());
79     bool mIsTuneCompleted GUARDED_BY(mMutex) = true;
80     Properties mProperties GUARDED_BY(mMutex);
81     ProgramSelector mCurrentProgram GUARDED_BY(mMutex) = {};
82     std::vector<VirtualProgram> mProgramList GUARDED_BY(mMutex) = {};
83     std::optional<AmFmBandRange> mCurrentAmFmBandRange GUARDED_BY(mMutex);
84     std::shared_ptr<ITunerCallback> mCallback GUARDED_BY(mMutex);
85 
86     // Bitmap for all ConfigFlag values
87     int mConfigFlagValues GUARDED_BY(mMutex) = 0;
88 
89     bool adjustAmFmRangeLocked() REQUIRES(mMutex);
90     void cancelLocked() REQUIRES(mMutex);
91     ProgramInfo tuneInternalLocked(const ProgramSelector& sel) REQUIRES(mMutex);
92     void startProgramListUpdatesLocked(const ProgramFilter& filter) REQUIRES(mMutex);
93     void cancelProgramListUpdateLocked() REQUIRES(mMutex);
94     void handleProgramInfoUpdateRadioCallback(ProgramInfo programInfo,
95                                               const std::shared_ptr<ITunerCallback>& callback)
96             EXCLUDES(mMutex);
97     bool findNextLocked(const ProgramSelector& current, bool directionUp, bool skipSubChannel,
98                         VirtualProgram* nextProgram) const REQUIRES(mMutex);
99     void jumpToFirstSubChannelLocked(std::vector<VirtualProgram>::const_iterator& it) const
100             REQUIRES(mMutex);
101     bool isConfigFlagSetLocked(ConfigFlag flag) const REQUIRES(mMutex);
102 
103     binder_status_t cmdHelp(int fd) const;
104     binder_status_t cmdTune(int fd, const char** args, uint32_t numArgs);
105     binder_status_t cmdSeek(int fd, const char** args, uint32_t numArgs);
106     binder_status_t cmdStep(int fd, const char** args, uint32_t numArgs);
107     binder_status_t cmdCancel(int fd, uint32_t numArgs);
108     binder_status_t cmdStartProgramListUpdates(int fd, const char** args, uint32_t numArgs);
109     binder_status_t cmdStopProgramListUpdates(int fd, uint32_t numArgs);
110 
111     binder_status_t dumpsys(int fd) EXCLUDES(mMutex);
112 };
113 
114 }  // namespace aidl::android::hardware::broadcastradio
115