/
reds
/
OpenDAW
Обзор
Документация
Войти
/
reds
/
OpenDAW
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
include/opendaw/io/AudioDevice.h
141 строка
3 KB
OpenDAW Developer
feat(v0.4.0): Add Audio Device Backend (ALSA)
21 фев 2026, 02:32
21 фев 2026, 02:32
8473a58
Код
Авторство
О чём код?
#pragma once #include <opendaw/audio/AudioBuffer.h> #include <functional> #include <string> #include <vector> #include <atomic> #include <thread> #include <memory> namespace opendaw { /** * @brief Конфигурация аудио-устройства */ struct AudioDeviceConfig { int sampleRate{48000}; int blockSize{512}; int numInputChannels{2}; int numOutputChannels{2}; int numBuffers{4}; std::string deviceName; double getLatencyMs() const { return (blockSize * numBuffers * 1000.0) / sampleRate; } }; /** * @brief Статус аудио-устройства */ enum class AudioDeviceStatus { Uninitialized, Initialized, Running, Stopped, Error }; /** * @brief Аудио-устройство (ALSA backend для Linux) * * Поддерживает: * - ALSA (Linux) * - Заглушка для других платформ */ class AudioDevice { public: AudioDevice(); ~AudioDevice(); /** * @brief Инициализация устройства */ bool initialize(const AudioDeviceConfig& config); /** * @brief Освобождение ресурсов */ void shutdown(); /** * @brief Запуск воспроизведения/записи */ bool start(); /** * @brief Остановка */ void stop(); /** * @brief Проверка статуса */ bool isRunning() const { return status_ == AudioDeviceStatus::Running; } AudioDeviceStatus getStatus() const { return status_; } /** * @brief Информация об устройстве */ const AudioDeviceConfig& getConfig() const { return config_; } int getSampleRate() const { return config_.sampleRate; } int getBlockSize() const { return config_.blockSize; } double getLatencyMs() const { return config_.getLatencyMs(); } /** * @brief Callback для обработки аудио * * Вызывается в real-time потоке */ using AudioCallback = std::function<void( const float** inputs, float** outputs, int numSamples, int numInputChannels, int numOutputChannels )>; void setAudioCallback(AudioCallback callback) { audioCallback_ = std::move(callback); } /** * @brief Callback для ошибок */ using ErrorCallback = std::function<void(const std::string&)>; void setErrorCallback(ErrorCallback callback) { errorCallback_ = std::move(callback); } /** * @brief Получение списка доступных устройств */ static std::vector<std::string> getAvailableDevices(); /** * @brief Создание устройства по умолчанию */ static std::unique_ptr<AudioDevice> createDefault(); private: void audioThreadFunc(); AudioDeviceConfig config_; AudioDeviceStatus status_{AudioDeviceStatus::Uninitialized}; AudioCallback audioCallback_; ErrorCallback errorCallback_; std::thread audioThread_; std::atomic<bool> shouldStop_{false}; // ALSA handles (Linux only) #ifdef HAVE_ALSA void* alsaHandle_{nullptr}; #else void* alsaHandle_{nullptr}; // Заглушка #endif }; } // namespace opendaw