#ifndef MEDIA_AUDIO_WIN_AUDIO_DUCKER_WIN_H_
#define MEDIA_AUDIO_WIN_AUDIO_DUCKER_WIN_H_
#include <mmdeviceapi.h>
#include <audiopolicy.h>
#include <wrl/client.h>
#include <map>
#include <string>
#include "base/functional/callback.h"
#include "base/memory/weak_ptr.h"
#include "base/process/process_handle.h"
#include "media/base/media_export.h"
namespace media {
class AudioDeviceListenerWin;
class AudioSessionCreationObserverWin;
class MEDIA_EXPORT AudioDuckerWin {
public:
using ShouldDuckProcessCallback =
base::RepeatingCallback<bool(base::ProcessId)>;
explicit AudioDuckerWin(ShouldDuckProcessCallback callback);
AudioDuckerWin(const AudioDuckerWin&) = delete;
AudioDuckerWin& operator=(const AudioDuckerWin&) = delete;
~AudioDuckerWin();
void StartDuckingOtherWindowsApplications();
void StopDuckingOtherWindowsApplications();
private:
void StartDuckingAudioSessionIfNecessary(
Microsoft::WRL::ComPtr<IAudioSessionControl2>& session);
void StopDuckingAudioSessionIfNecessary(
Microsoft::WRL::ComPtr<IAudioSessionControl2>& session);
void OnDefaultDeviceChanged();
void DuckNewAudioSessionsIfNecessary();
std::unique_ptr<AudioSessionCreationObserverWin> session_creation_observer_;
ShouldDuckProcessCallback should_duck_process_callback_;
std::map<std::wstring, float> ducked_applications_;
Microsoft::WRL::ComPtr<IAudioSessionManager2> ducked_audio_session_manager_;
std::unique_ptr<AudioDeviceListenerWin> output_device_listener_;
base::WeakPtrFactory<AudioDuckerWin> weak_factory_{this};
};
}
#endif