18f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan// Copyright 2016 The Android Open Source Project 28f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan// 38f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan// Licensed under the Apache License, Version 2.0 (the "License"); 48f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan// you may not use this file except in compliance with the License. 58f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan// You may obtain a copy of the License at 68f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan// 78f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan// http://www.apache.org/licenses/LICENSE-2.0 88f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan// 98f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan// Unless required by applicable law or agreed to in writing, software 108f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan// distributed under the License is distributed on an "AS IS" BASIS, 118f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 128f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan// See the License for the specific language governing permissions and 138f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan// limitations under the License. 148f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan// 158f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 168f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan// Client for the brilloaudioservice. 178f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 188f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan#ifndef BRILLO_AUDIO_AUDIOSERVICE_BRILLO_AUDIO_CLIENT_H_ 198f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan#define BRILLO_AUDIO_AUDIOSERVICE_BRILLO_AUDIO_CLIENT_H_ 208f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 2139a3e9ee6d6cb9b50cf7bbc850c1d48fed23959bLuis Hector Chavez#include <map> 228f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan#include <memory> 238f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan#include <vector> 248f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 258f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan#include <base/bind.h> 268f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan#include <base/memory/weak_ptr.h> 278f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan#include <gtest/gtest_prod.h> 288f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan#include <media/IAudioPolicyService.h> 298f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 308f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan#include "android/brillo/brilloaudioservice/IBrilloAudioService.h" 318f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan#include "audio_service_callback.h" 328f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 338f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathanusing android::brillo::brilloaudioservice::IBrilloAudioService; 348f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 358f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathannamespace brillo { 368f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 378f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathanclass BrilloAudioClient { 388f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan public: 39005f6b52cae79dedc78a9a82fe9139a8790d6ec5Ralph Nathan virtual ~BrilloAudioClient(); 408f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 418f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // Get or create a pointer to the client instance. 428f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // 438f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // Returns a weak_ptr to a BrilloAudioClient object. 448f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan static std::weak_ptr<BrilloAudioClient> GetClientInstance(); 458f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 468f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // Query brillo audio service to get list of connected audio devices. 478f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // 488f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // |flag| is an int which is either GET_DEVICES_INPUTS or GET_DEVICES_OUTPUTS. 498f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // |devices| is a reference to a vector of audio_devices_t. 508f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // 518f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // Returns 0 on success and errno on failure. 528f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan int GetDevices(int flag, std::vector<int>& devices); 538f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 548f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // Register a callback object with the service. 558f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // 56005f6b52cae79dedc78a9a82fe9139a8790d6ec5Ralph Nathan // |callback| is a ref pointer to a callback object to be register with the 578f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // brillo audio service. 588f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // |callback_id| is a pointer to an int that represents a callback id token on 598f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // success and 0 on failure. 608f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // 618f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // Returns 0 on success and errno on failure. 62005f6b52cae79dedc78a9a82fe9139a8790d6ec5Ralph Nathan int RegisterAudioCallback(android::sp<AudioServiceCallback> callback, 63005f6b52cae79dedc78a9a82fe9139a8790d6ec5Ralph Nathan int* callback_id); 648f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 658f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // Unregister a callback object with the service. 668f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // 678f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // |callback_id| is an int referring to the callback object. 688f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // 698f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // Returns 0 on success and errno on failure. 708f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan int UnregisterAudioCallback(int callback_id); 718f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 728f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // Set a device to be the default. This does not communicate with the brillo 738f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // audio service but instead communicates directly with the audio policy 748f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // service. 758f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // 768f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // Please see system/audio_policy.h for details on these arguments. 778f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // 788f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // Returns 0 on success and errno on failure. 798f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan int SetDevice(audio_policy_force_use_t usage, 808f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan audio_policy_forced_cfg_t config); 818f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 822bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // Get the maximum number of steps for a given BAudioUsage. 832bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // 842bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // |usage| is an enum of type BAudioUsage. 852bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // |max_steps| is a pointer to the maximum number of steps. 862bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // 872bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // Returns 0 on success and errno on failure. 882bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan int GetMaxVolumeSteps(BAudioUsage usage, int* max_steps); 892bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan 902bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // Set the maximum number of steps to use for a given BAudioUsage. 912bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // 922bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // |usage| is an enum of type BAudioUsage. 932bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // |max_steps| is an int between 0 and 100. 942bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // 952bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // Returns 0 on success and errno on failure. 962bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan int SetMaxVolumeSteps(BAudioUsage usage, int max_steps); 972bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan 982bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // Set the volume index for a given BAudioUsage and device. 992bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // 1002bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // |usage| is an enum of type BAudioUsage. 1012bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // |device| is of type audio_devices_t. 1022bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // |index| is an int representing the current index. 1032bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // 1042bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // Returns 0 on success and errno on failure. 1052bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan int SetVolumeIndex(BAudioUsage usage, audio_devices_t device, int index); 1062bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan 1072bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // Get the volume index for a given BAudioUsage and device. 1082bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // 1092bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // |usage| is an enum of type BAudioUsage. 1102bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // |device| is of type audio_devices_t. 1112bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // |index| is a pointer to an int representing the current index. 1122bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // 1132bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // Returns 0 on success and errno on failure. 1142bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan int GetVolumeIndex(BAudioUsage usage, audio_devices_t device, int* index); 1152bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan 1162bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // Get default stream to use for volume buttons. 1172bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // 1182bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // |usage| is a pointer to a BAudioUsage. 1192bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // 1202bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // Returns 0 on success and errno on failure. 1212bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan int GetVolumeControlStream(BAudioUsage* usage); 1222bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan 1232bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // Set default stream to use for volume buttons. 1242bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // 1252bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // |usage| is an enum of type BAudioUsage. 1262bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // 1272bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // Returns 0 on success and errno on failure. 1282bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan int SetVolumeControlStream(BAudioUsage usage); 1292bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan 1302bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // Increment the volume. 1312bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // 1322bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // Returns 0 on success and errno on failure. 1332bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan int IncrementVolume(); 1342bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan 1352bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // Decrement the volume. 1362bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // 1372bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan // Returns 0 on success and errno on failure. 1382bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan int DecrementVolume(); 1392bb3192c769ec59becef0a5cd14b8747296aed7aRalph Nathan 140005f6b52cae79dedc78a9a82fe9139a8790d6ec5Ralph Nathan protected: 1418f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan BrilloAudioClient() = default; 1428f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 143005f6b52cae79dedc78a9a82fe9139a8790d6ec5Ralph Nathan private: 144005f6b52cae79dedc78a9a82fe9139a8790d6ec5Ralph Nathan friend class BrilloAudioClientTest; 145005f6b52cae79dedc78a9a82fe9139a8790d6ec5Ralph Nathan FRIEND_TEST(BrilloAudioClientTest, InitializeNoService); 146005f6b52cae79dedc78a9a82fe9139a8790d6ec5Ralph Nathan FRIEND_TEST(BrilloAudioClientTest, 147005f6b52cae79dedc78a9a82fe9139a8790d6ec5Ralph Nathan CheckInitializeRegistersForDeathNotifications); 148005f6b52cae79dedc78a9a82fe9139a8790d6ec5Ralph Nathan 1498f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // Initialize the BrilloAudioClient object and connects to the brillo audio 1508f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // service and the audio policy service. It also registers for death 1518f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // notifications. 1528f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan bool Initialize(); 1538f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 1548f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // Callback to be triggered when the brillo audio service dies. It attempts to 1558f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // reconnect to the service. 156005f6b52cae79dedc78a9a82fe9139a8790d6ec5Ralph Nathan virtual void OnBASDisconnect(); 1578f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 1588f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // Helper method to connect to a service and register a callback to receive 1598f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // death notifications. 1608f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // 1618f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // |service_name| is a string representing the name of the service. 1628f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // |callback| is a base::Closure which will be called if the service dies. 1635e088a7ae832fe6607b2b76f6d0adf53e1932695Chih-Hung Hsieh android::sp<android::IBinder> ConnectToService(const std::string& service_name, 1648f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan const base::Closure& callback); 1658f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 1668f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // Pointer to the BrilloAudioClient object. 1678f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan static std::shared_ptr<BrilloAudioClient> instance_; 1688f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 1698f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // Used to generate weak_ptr to BrilloAudioClient for use in base::Bind. 1708f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan base::WeakPtrFactory<BrilloAudioClient> weak_ptr_factory_{this}; 1718f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // Pointer to the brillo audio service. 1728f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan android::sp<IBrilloAudioService> brillo_audio_service_; 1738f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // Counter for callback IDs. 1748f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan static int callback_id_counter_; 1758f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan // Map of callback ids to callback objects. 176005f6b52cae79dedc78a9a82fe9139a8790d6ec5Ralph Nathan std::map<int, android::sp<AudioServiceCallback> > callback_map_; 1778f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 1788f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan DISALLOW_COPY_AND_ASSIGN(BrilloAudioClient); 1798f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan}; 1808f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 1818f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan} // namespace brillo 1828f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan 1838f559cd8c8fbd6122591a5ee1d665c54a9fd8549Ralph Nathan#endif // BRILLO_AUDIO_AUDIOSERVICE_BRILLO_AUDIO_CLIENT_H_ 184