12#include <private/qaudiohelpers_p.h>
17#define AL_FORMAT_MONO_FLOAT32 0x10010
18#define AL_FORMAT_STEREO_FLOAT32 0x10011
36 ALCdevice *
device =
nullptr;
43 alcGetIntegerv(aldata->device, ALC_CAPTURE_SAMPLES, 1, &samples);
44 samples = qMin(samples, m_format.framesForBytes(m_bufferSize));
45 auto bytes = m_format.bytesForFrames(samples);
46 auto err = alcGetError(aldata->device);
47 alcCaptureSamples(aldata->device, m_tmpData, samples);
48 err = alcGetError(aldata->device);
50 qWarning() << alcGetString(aldata->device, err);
51 return setError(QAudio::FatalError);
54 QAudioHelperInternal::qMultiplySamples(volume(), m_format, m_tmpData, m_tmpData, bytes);
56 m_device->write(m_tmpData,bytes);
62 if (device.id().contains(
"Emscripten")) {
63 aldata =
new ALData();
64 connect(m_timer, &QTimer::timeout,
this, [
this](){
68 else if (bytesReady() > 0)
69 emit m_device->readyRead();
72 m_bufferSize = m_format.bytesForDuration(DEFAULT_BUFFER_DURATION);
83 m_device =
new QWasmAudioSourceDevice(
this);
84 m_device->open(QIODevice::ReadOnly);
92 auto formatError = [
this](){
93 qWarning() <<
"Unsupported audio format " << m_format;
94 setError(QAudio::OpenError);
97 switch (m_format.sampleFormat()) {
98 case QAudioFormat::UInt8:
99 switch (m_format.channelCount()) {
101 format = AL_FORMAT_MONO8;
104 format = AL_FORMAT_STEREO8;
107 return formatError();
110 case QAudioFormat::Int16:
111 switch (m_format.channelCount()) {
113 format = AL_FORMAT_MONO16;
116 format = AL_FORMAT_STEREO16;
119 return formatError();
122 case QAudioFormat::Float:
123 switch (m_format.channelCount()) {
131 return formatError();
135 return formatError();
140 m_tmpData =
new char[m_bufferSize];
143 m_timer->setInterval(m_format.durationForBytes(m_bufferSize) / 3000);
146 alcGetError(aldata->device);
147 aldata->device = alcCaptureOpenDevice(m_audioDevice.id().data(), m_format.sampleRate(), format,
148 m_format.framesForBytes(m_bufferSize));
150 auto err = alcGetError(aldata->device);
152 qWarning() <<
"alcCaptureOpenDevice" << alcGetString(aldata->device, err);
153 return setError(QAudio::OpenError);
155 alcCaptureStart(aldata->device);
156 m_elapsedTimer.start();
157 auto cerr = alcGetError(aldata->device);
159 qWarning() <<
"alcCaptureStart" << alcGetString(aldata->device, cerr);
160 return setError(QAudio::OpenError);
170 alcCaptureStop(aldata->device);
171 alcCaptureCloseDevice(aldata->device);
172 m_elapsedTimer.invalidate();
178 m_device->deleteLater();
192 setError(QAudio::NoError);
201 alcCaptureStop(aldata->device);
210 alcCaptureStart(aldata->device);
218 alcGetIntegerv(aldata->device, ALC_CAPTURE_SAMPLES, 1, &samples);
219 return m_format.bytesForFrames(samples);
226 m_bufferSize = value;
236 return m_format.durationForBytes(m_processed);
242 return QAudio::ActiveState;
244 return QAudio::StoppedState;
255 alcGetIntegerv(m_in->aldata->device, ALC_CAPTURE_SAMPLES, 1, &samples);
256 samples = qMin(samples, m_in->m_format.framesForBytes(maxlen));
257 auto bytes = m_in->m_format.bytesForFrames(samples);
258 alcGetError(m_in->aldata->device);
259 alcCaptureSamples(m_in->aldata->device, data, samples);
260 if (m_in->volume() < 1)
261 QAudioHelperInternal::qMultiplySamples(m_in->volume(), m_in->m_format, data, data, bytes);
262 auto err = alcGetError(m_in->aldata->device);
264 qWarning() << alcGetString(m_in->aldata->device, err);
265 m_in->setError(QAudio::FatalError);
268 m_in->m_processed += bytes;
qint64 readData(char *data, qint64 maxlen) override
Reads up to maxSize bytes from the device into data, and returns the number of bytes read or -1 if an...
qint64 writeData(const char *data, qint64 len) override
Writes up to maxSize bytes from data to the device.
QWasmAudioSourceDevice(QWasmAudioSource *in)
qint64 processedUSecs() const override
QAudio::State state() const override
QIODevice * start() override
qsizetype bufferSize() const override
void setBufferSize(qsizetype value) override
void start(QIODevice *device) override
QWasmAudioSource(QAudioDevice, const QAudioFormat &, QObject *parent)
qsizetype bytesReady() const override
#define AL_FORMAT_STEREO_FLOAT32
#define AL_FORMAT_MONO_FLOAT32
constexpr unsigned int DEFAULT_BUFFER_DURATION