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);
86 m_device =
new QWasmAudioSourceDevice(
this);
87 m_device->open(QIODevice::ReadOnly);
95 auto formatError = [
this](){
96 qWarning() <<
"Unsupported audio format " << m_format;
97 setError(QAudio::OpenError);
100 switch (m_format.sampleFormat()) {
101 case QAudioFormat::UInt8:
102 switch (m_format.channelCount()) {
104 format = AL_FORMAT_MONO8;
107 format = AL_FORMAT_STEREO8;
110 return formatError();
113 case QAudioFormat::Int16:
114 switch (m_format.channelCount()) {
116 format = AL_FORMAT_MONO16;
119 format = AL_FORMAT_STEREO16;
122 return formatError();
125 case QAudioFormat::Float:
126 switch (m_format.channelCount()) {
134 return formatError();
138 return formatError();
143 m_tmpData =
new char[m_bufferSize];
146 m_timer->setInterval(m_format.durationForBytes(m_bufferSize) / 3000);
149 alcGetError(aldata->device);
150 aldata->device = alcCaptureOpenDevice(m_audioDevice.id().data(), m_format.sampleRate(), format,
151 m_format.framesForBytes(m_bufferSize));
153 auto err = alcGetError(aldata->device);
155 qWarning() <<
"alcCaptureOpenDevice" << alcGetString(aldata->device, err);
156 return setError(QAudio::OpenError);
158 alcCaptureStart(aldata->device);
159 m_elapsedTimer.start();
160 auto cerr = alcGetError(aldata->device);
162 qWarning() <<
"alcCaptureStart" << alcGetString(aldata->device, cerr);
163 return setError(QAudio::OpenError);
173 alcCaptureStop(aldata->device);
174 alcCaptureCloseDevice(aldata->device);
175 m_elapsedTimer.invalidate();
181 m_device->deleteLater();
195 setError(QAudio::NoError);
204 alcCaptureStop(aldata->device);
213 alcCaptureStart(aldata->device);
221 alcGetIntegerv(aldata->device, ALC_CAPTURE_SAMPLES, 1, &samples);
222 return m_format.bytesForFrames(samples);
229 m_bufferSize = value;
239 return m_format.durationForBytes(m_processed);
245 return QAudio::ActiveState;
247 return QAudio::StoppedState;
258 alcGetIntegerv(m_in->aldata->device, ALC_CAPTURE_SAMPLES, 1, &samples);
259 samples = qMin(samples, m_in->m_format.framesForBytes(maxlen));
260 auto bytes = m_in->m_format.bytesForFrames(samples);
261 alcGetError(m_in->aldata->device);
262 alcCaptureSamples(m_in->aldata->device, data, samples);
263 if (m_in->volume() < 1)
264 QAudioHelperInternal::qMultiplySamples(m_in->volume(), m_in->m_format, data, data, bytes);
265 auto err = alcGetError(m_in->aldata->device);
267 qWarning() << alcGetString(m_in->aldata->device, err);
268 m_in->setError(QAudio::FatalError);
271 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
~QWasmAudioSource() 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