// Copyright (C) 2025 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QAAUDIOSTREAM_P_H #define QAAUDIOSTREAM_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include QT_BEGIN_NAMESPACE namespace QtAAudio { Q_DECLARE_LOGGING_CATEGORY(qLcAAudioStream) struct StreamBuilder; struct Stream { explicit Stream(StreamBuilder &builder); ~Stream(); Q_DISABLE_COPY_MOVE(Stream) bool start(); void stop(); void pause(); void flush(); bool isOpen() const; bool areStreamParametersRespected() const; private: void close(); aaudio_result_t waitForTargetState(aaudio_stream_state_t targetState); template aaudio_result_t requestWithExpectedState(Functor &&request, aaudio_stream_state_t expected); // stream members AAudioStream *m_stream{ nullptr }; bool m_areStreamParametersRespected{ false }; }; struct StreamParameterSet { aaudio_sharing_mode_t sharingMode = AAUDIO_SHARING_MODE_SHARED; aaudio_direction_t direction = AAUDIO_DIRECTION_OUTPUT; aaudio_usage_t outputUsage = AAUDIO_USAGE_MEDIA; aaudio_content_type_t outputContentType = AAUDIO_CONTENT_TYPE_MUSIC; aaudio_input_preset_t inputPreset = AAUDIO_INPUT_PRESET_VOICE_RECOGNITION; }; struct StreamBuilder { friend Stream; StreamBuilder(QAudioFormat format); ~StreamBuilder(); Q_DISABLE_COPY_MOVE(StreamBuilder) QAudioFormat format; AAudioStream_dataCallback callback; AAudioStream_errorCallback errorCallback; void *userData{ nullptr }; StreamParameterSet params; int32_t deviceId{ AAUDIO_UNSPECIFIED }; int32_t bufferCapacity{ AAUDIO_UNSPECIFIED }; void setupBuilder(); private: AAudioStreamBuilder *m_builder{ nullptr }; }; } // namespace QtAAudio QT_END_NAMESPACE #endif