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