#ifndef MEDIA_AUDIO_MAC_AUDIO_LOOPBACK_INPUT_MAC_IMPL_H_
#define MEDIA_AUDIO_MAC_AUDIO_LOOPBACK_INPUT_MAC_IMPL_H_
#include <string>
#include "base/apple/scoped_cftyperef.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/sequence_checker.h"
#include "base/time/time.h"
#include "media/audio/agc_audio_stream.h"
#include "media/audio/audio_io.h"
#include "media/audio/mac/audio_manager_mac.h"
#include "media/base/audio_parameters.h"
@class NSError;
@class SCContentFilter;
@class ScreenCaptureKitAudioHelper;
@class SCShareableContent;
@class SCStream;
@class SCStreamConfiguration;
@protocol SCStreamDelegate;
using CMSampleBufferRef = struct opaqueCMSampleBuffer*;
namespace media {
class SharedHelper;
class MEDIA_EXPORT API_AVAILABLE(macos(13.0)) SCKAudioInputStream
: public AgcAudioStream<AudioInputStream> {
using NotifyOnCloseCallback =
base::RepeatingCallback<void(AudioInputStream*)>;
using StartSCStreamMockingCallback =
base::RepeatingCallback<void(SCStream*,
SCContentFilter*,
SCStreamConfiguration*,
id<SCStreamDelegate>)>;
public:
SCKAudioInputStream(const AudioParameters& params,
const std::string& device_id,
const AudioManager::LogCallback log_callback,
const NotifyOnCloseCallback close_callback);
SCKAudioInputStream(
const AudioParameters& params,
const std::string& device_id,
const AudioManager::LogCallback log_callback,
const NotifyOnCloseCallback close_callback,
const StartSCStreamMockingCallback start_scstream_mocking_callback,
const base::TimeDelta shareable_content_timeout);
SCKAudioInputStream(const SCKAudioInputStream&) = delete;
SCKAudioInputStream(SCKAudioInputStream&&) = delete;
SCKAudioInputStream(const SCKAudioInputStream&&) = delete;
SCKAudioInputStream& operator=(const SCKAudioInputStream&) = delete;
SCKAudioInputStream& operator=(SCKAudioInputStream&&) = delete;
SCKAudioInputStream& operator=(const SCKAudioInputStream&&) = delete;
~SCKAudioInputStream() override;
AudioInputStream::OpenOutcome Open() override;
void Start(AudioInputCallback* callback) override;
void Stop() override;
void Close() override;
double GetMaxVolume() override;
void SetVolume(double volume) override;
double GetVolume() override;
bool IsMuted() override;
void SetOutputDeviceForAec(const std::string& output_device_id) override;
private:
void OnStreamSample(
base::apple::ScopedCFTypeRef<CMSampleBufferRef> sample_buffer,
const double volume);
void OnStreamError();
void SendLogMessage(const char* format, ...);
const AudioParameters params_;
const std::string device_id_;
const std::unique_ptr<AudioBus> audio_bus_;
raw_ptr<AudioInputCallback> sink_;
AudioManager::LogCallback log_callback_;
const NotifyOnCloseCallback close_callback_;
StartSCStreamMockingCallback start_scstream_mocking_callback_;
scoped_refptr<SharedHelper> shared_helper_;
ScreenCaptureKitAudioHelper* __strong sck_helper_;
SCStream* __strong stream_;
dispatch_queue_t __strong queue_;
const base::TimeDelta buffer_frames_duration_;
SEQUENCE_CHECKER(sequence_checker_);
};
}
#endif