// Copyright 2016 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // Handler for input events in /dev/input. AudioDeviceHandler handles events // only for audio devices being plugged in/removed from the system. Implements // some of the functionality present in WiredAccessoryManager.java. #ifndef BRILLO_AUDIO_AUDIOSERVICE_AUDIO_DEVICE_HANDLER_H_ #define BRILLO_AUDIO_AUDIOSERVICE_AUDIO_DEVICE_HANDLER_H_ #include #include #include #include #include #include #include #include namespace brillo { class AudioDeviceHandler { public: AudioDeviceHandler(); virtual ~AudioDeviceHandler(); // Get the current state of the headset jack and update AudioSystem based on // the initial state. // // |aps| is a pointer to the binder object. void Init(android::sp aps); // Process input events from the kernel. Connecting/disconnecting an audio // device will result in multiple calls to this method. // // |event| is a pointer to an input_event. This function should be able to // gracefully handle input events that are not relevant to the functionality // provided by this class. void ProcessEvent(const struct input_event& event); // Inform the handler that the audio policy service has been disconnected. void APSDisconnect(); // Inform the handler that the audio policy service is reconnected. // // |aps| is a pointer to the binder object. void APSConnect(android::sp aps); private: friend class AudioDeviceHandlerTest; FRIEND_TEST(AudioDeviceHandlerTest, DisconnectAllSupportedDevicesCallsDisconnect); FRIEND_TEST(AudioDeviceHandlerTest, InitCallsDisconnectAllSupportedDevices); FRIEND_TEST(AudioDeviceHandlerTest, InitialAudioStateMic); FRIEND_TEST(AudioDeviceHandlerTest, InitialAudioStateHeadphone); FRIEND_TEST(AudioDeviceHandlerTest, InitialAudioStateHeadset); FRIEND_TEST(AudioDeviceHandlerTest, InitialAudioStateNone); FRIEND_TEST(AudioDeviceHandlerTest, InitialAudioStateInvalid); FRIEND_TEST(AudioDeviceHandlerTest, ProcessEventEmpty); FRIEND_TEST(AudioDeviceHandlerTest, ProcessEventMicrophonePresent); FRIEND_TEST(AudioDeviceHandlerTest, ProcessEventHeadphonePresent); FRIEND_TEST(AudioDeviceHandlerTest, ProcessEventMicrophoneNotPresent); FRIEND_TEST(AudioDeviceHandlerTest, ProcessEventHeadphoneNotPresent); FRIEND_TEST(AudioDeviceHandlerTest, ProcessEventInvalid); FRIEND_TEST(AudioDeviceHandlerTest, UpdateAudioSystemNone); FRIEND_TEST(AudioDeviceHandlerTest, UpdateAudioSystemConnectMic); FRIEND_TEST(AudioDeviceHandlerTest, UpdateAudioSystemConnectHeadphone); FRIEND_TEST(AudioDeviceHandlerTest, UpdateAudioSystemConnectHeadset); FRIEND_TEST(AudioDeviceHandlerTest, UpdateAudioSystemDisconnectMic); FRIEND_TEST(AudioDeviceHandlerTest, UpdateAudioSystemDisconnectHeadphone); FRIEND_TEST(AudioDeviceHandlerTest, UpdateAudioSystemDisconnectHeadset); FRIEND_TEST(AudioDeviceHandlerTest, ConnectAudioDeviceInput); FRIEND_TEST(AudioDeviceHandlerTest, ConnectAudioDeviceOutput); FRIEND_TEST(AudioDeviceHandlerTest, DisconnectAudioDeviceInput); FRIEND_TEST(AudioDeviceHandlerTest, DisconnectAudioDeviceOutput); // Read the initial state of audio devices in /sys/class/* and update // the audio policy service. // // |path| is the file that contains the initial audio jack state. void GetInitialAudioDeviceState(const base::FilePath& path); // Update the audio policy service once an input_event has completed. // // |headphone| is true is headphones are connected. // |microphone| is true is microphones are connected. void UpdateAudioSystem(bool headphone, bool microphone); // Notify the audio policy service that this device has been removed. // // |device| is the audio device whose state is to be changed. // |state| is the current state of |device|. virtual void NotifyAudioPolicyService(audio_devices_t device, audio_policy_dev_state_t state); // Connect an audio device by calling aps and add it to the appropriate set // (either connected_input_devices_ or connected_output_devices_). // // |device| is the audio device that has been added. void ConnectAudioDevice(audio_devices_t device); // Disconnect an audio device by calling aps and remove it from the // appropriate set (either connected_input_devices_ or // connected_output_devices_). // // |device| is the audio device that has been disconnected. void DisconnectAudioDevice(audio_devices_t device); // Disconnected all connected audio devices. void DisconnectAllConnectedDevices(); // Disconnect all supported audio devices. void DisconnectAllSupportedDevices(); // All input devices currently supported by AudioDeviceHandler. std::vector kSupportedInputDevices_{ AUDIO_DEVICE_IN_WIRED_HEADSET}; // All output devices currently supported by AudioDeviceHandler. std::vector kSupportedOutputDevices_{ AUDIO_DEVICE_OUT_WIRED_HEADSET, AUDIO_DEVICE_OUT_WIRED_HEADPHONE}; // Pointer to the audio policy service. android::sp aps_; protected: // Set of connected input devices. std::set connected_input_devices_; // Set of connected output devices. std::set connected_output_devices_; // Keeps track of whether a headphone has been connected. Used by ProcessEvent // and UpdateAudioSystem. bool headphone_; // Keeps track of whether a microphone has been connected. Used by // ProcessEvent and UpdateAudioSystem. bool microphone_; }; } // namespace brillo #endif // BRILLO_AUDIO_AUDIOSERVICE_AUDIO_DEVICE_HANDLER_H_