/* * Oak Video Editor - Non-Linear Video Editor * Copyright (C) 2025 Olive CE Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef AUDIOMANAGER_H #define AUDIOMANAGER_H #include #include #include #include #include "audiovisualwaveform.h" #include "audio/audioprocessor.h" #include "common/define.h" #include "codec/ffmpeg/ffmpegencoder.h" #include "render/audioplaybackcache.h" #include "render/previewaudiodevice.h" namespace olive { /** * @brief Audio input and output management class * * Wraps around a QAudioOutput and AudioHybridDevice, connecting them together and exposing audio functionality to * the rest of the system. */ class AudioManager : public QObject { Q_OBJECT public: static void CreateInstance(); static void DestroyInstance(); static AudioManager *instance(); void SetOutputNotifyInterval(int n); bool PushToOutput(const AudioParams ¶ms, const QByteArray &samples, QString *error = nullptr); void ClearBufferedOutput(); void StopOutput(); PaDeviceIndex GetOutputDevice() const { return output_device_; } PaDeviceIndex GetInputDevice() const { return input_device_; } void SetOutputDevice(PaDeviceIndex device); void SetInputDevice(PaDeviceIndex device); void HardReset(); bool StartRecording(const EncodingParams ¶ms, QString *error_str = nullptr); void StopRecording(); static PaDeviceIndex FindConfigDeviceByName(bool is_output_device); static PaDeviceIndex FindDeviceByName(const QString &s, bool is_output_device); static PaStreamParameters GetPortAudioParams(const AudioParams &p, PaDeviceIndex device); signals: void OutputNotify(); void OutputParamsChanged(); private: AudioManager(); virtual ~AudioManager() override; static PaSampleFormat GetPortAudioSampleFormat(SampleFormat fmt); void CloseOutputStream(); static AudioManager *instance_; PaDeviceIndex output_device_; PaStream *output_stream_; AudioParams output_params_; PreviewAudioDevice *output_buffer_; PaDeviceIndex input_device_; PaStream *input_stream_; FFmpegEncoder *input_encoder_; }; } #endif // AUDIOMANAGER_H