| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef MEDIA_AUDIO_MAC_AUDIO_DEVICE_LISTENER_MAC_H_ |
| #define MEDIA_AUDIO_MAC_AUDIO_DEVICE_LISTENER_MAC_H_ |
| |
| #include <CoreAudio/AudioHardware.h> |
| |
| #include <map> |
| #include <memory> |
| #include <utility> |
| |
| #include "base/callback.h" |
| #include "base/containers/flat_map.h" |
| #include "base/macros.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/threading/thread_checker.h" |
| #include "media/base/media_export.h" |
| |
| namespace media { |
| |
| // AudioDeviceListenerMac facilitates execution of device listener callbacks |
| // issued via CoreAudio. |
| class MEDIA_EXPORT AudioDeviceListenerMac { |
| public: |
| // |listener_cb| will be called when a device change occurs; it's a permanent |
| // callback and must outlive AudioDeviceListenerMac. Note that |listener_cb| |
| // might not be executed on the same thread as construction. |
| AudioDeviceListenerMac(base::RepeatingClosure listener_cb, |
| bool monitor_default_input = false, |
| bool monitor_addition_removal = false, |
| bool monitor_sources = false); |
| |
| AudioDeviceListenerMac(const AudioDeviceListenerMac&) = delete; |
| AudioDeviceListenerMac& operator=(const AudioDeviceListenerMac&) = delete; |
| |
| ~AudioDeviceListenerMac(); |
| |
| private: |
| friend class AudioDeviceListenerMacTest; |
| class PropertyListener; |
| static const AudioObjectPropertyAddress |
| kDefaultOutputDeviceChangePropertyAddress; |
| static const AudioObjectPropertyAddress |
| kDefaultInputDeviceChangePropertyAddress; |
| static const AudioObjectPropertyAddress kDevicesPropertyAddress; |
| |
| static OSStatus OnEvent(AudioObjectID object, |
| UInt32 num_addresses, |
| const AudioObjectPropertyAddress addresses[], |
| void* context); |
| |
| bool AddPropertyListener(PropertyListener* property_listener); |
| void RemovePropertyListener(PropertyListener* property_listener); |
| void OnDevicesAddedOrRemoved(); |
| void UpdateSourceListeners(); |
| |
| base::RepeatingClosure listener_cb_; |
| std::unique_ptr<PropertyListener> default_output_listener_; |
| std::unique_ptr<PropertyListener> default_input_listener_; |
| std::unique_ptr<PropertyListener> addition_removal_listener_; |
| |
| using SourceListenerKey = std::pair<AudioObjectID, bool>; |
| using SourceListenerMap = |
| base::flat_map<SourceListenerKey, std::unique_ptr<PropertyListener>>; |
| SourceListenerMap source_listeners_; |
| |
| // AudioDeviceListenerMac must be constructed and destructed on the same |
| // thread. |
| THREAD_CHECKER(thread_checker_); |
| |
| base::WeakPtrFactory<AudioDeviceListenerMac> weak_factory_; |
| }; |
| |
| } // namespace media |
| |
| #endif // MEDIA_AUDIO_MAC_AUDIO_DEVICE_LISTENER_MAC_H_ |