mirror of
https://github.com/qTox/qTox.git
synced 2024-03-22 14:00:36 +08:00
fix: Allocate memory to input buffer
This commit is contained in:
parent
2353a66fde
commit
900f2a1ad3
|
@ -301,6 +301,7 @@ bool OpenAL::initInput(const QString& deviceName, uint32_t channels)
|
||||||
assert(!alInDev);
|
assert(!alInDev);
|
||||||
|
|
||||||
// TODO: Try to actually detect if our audio source is stereo
|
// TODO: Try to actually detect if our audio source is stereo
|
||||||
|
this->channels = channels;
|
||||||
int stereoFlag = channels == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16;
|
int stereoFlag = channels == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16;
|
||||||
const uint32_t sampleRate = AUDIO_SAMPLE_RATE;
|
const uint32_t sampleRate = AUDIO_SAMPLE_RATE;
|
||||||
const uint16_t frameDuration = AUDIO_FRAME_DURATION;
|
const uint16_t frameDuration = AUDIO_FRAME_DURATION;
|
||||||
|
@ -316,6 +317,7 @@ bool OpenAL::initInput(const QString& deviceName, uint32_t channels)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inputBuffer = new int16_t[AUDIO_FRAME_SAMPLE_COUNT * channels];
|
||||||
setInputGain(Settings::getInstance().getAudioInGainDecibel());
|
setInputGain(Settings::getInstance().getAudioInGainDecibel());
|
||||||
setInputThreshold(Settings::getInstance().getAudioThreshold());
|
setInputThreshold(Settings::getInstance().getAudioThreshold());
|
||||||
|
|
||||||
|
@ -468,6 +470,8 @@ void OpenAL::cleanupInput()
|
||||||
alInDev = nullptr;
|
alInDev = nullptr;
|
||||||
else
|
else
|
||||||
qWarning() << "Failed to close input";
|
qWarning() << "Failed to close input";
|
||||||
|
|
||||||
|
delete[] inputBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -529,9 +533,9 @@ void OpenAL::playMono16SoundCleanup()
|
||||||
*
|
*
|
||||||
* @return volume in percent of max volume
|
* @return volume in percent of max volume
|
||||||
*/
|
*/
|
||||||
float OpenAL::getVolume(int16_t *buf)
|
float OpenAL::getVolume()
|
||||||
{
|
{
|
||||||
quint32 samples = AUDIO_FRAME_SAMPLE_COUNT * AUDIO_CHANNELS;
|
quint32 samples = AUDIO_FRAME_SAMPLE_COUNT * channels;
|
||||||
float sum = 0.0;
|
float sum = 0.0;
|
||||||
for (quint32 i = 0; i < samples; i++) {
|
for (quint32 i = 0; i < samples; i++) {
|
||||||
float sample = (float)buf[i] / (float)std::numeric_limits<int16_t>::max();
|
float sample = (float)buf[i] / (float)std::numeric_limits<int16_t>::max();
|
||||||
|
@ -567,10 +571,9 @@ void OpenAL::doAudio()
|
||||||
if (static_cast<ALuint>(curSamples) < AUDIO_FRAME_SAMPLE_COUNT)
|
if (static_cast<ALuint>(curSamples) < AUDIO_FRAME_SAMPLE_COUNT)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int16_t buf[AUDIO_FRAME_SAMPLE_COUNT * AUDIO_CHANNELS];
|
alcCaptureSamples(alInDev, inputBuffer, AUDIO_FRAME_SAMPLE_COUNT);
|
||||||
alcCaptureSamples(alInDev, buf, AUDIO_FRAME_SAMPLE_COUNT);
|
|
||||||
|
|
||||||
float volume = getVolume(buf);
|
float volume = getVolume();
|
||||||
if (volume >= inputThreshold)
|
if (volume >= inputThreshold)
|
||||||
{
|
{
|
||||||
isActive = true;
|
isActive = true;
|
||||||
|
@ -583,16 +586,16 @@ void OpenAL::doAudio()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (quint32 i = 0; i < AUDIO_FRAME_SAMPLE_COUNT * AUDIO_CHANNELS; ++i) {
|
for (quint32 i = 0; i < AUDIO_FRAME_SAMPLE_COUNT * channels; ++i) {
|
||||||
// gain amplification with clipping to 16-bit boundaries
|
// gain amplification with clipping to 16-bit boundaries
|
||||||
int ampPCM =
|
int ampPCM = qBound<int>(std::numeric_limits<int16_t>::min(),
|
||||||
qBound<int>(std::numeric_limits<int16_t>::min(), qRound(buf[i] * inputGainFactor()),
|
qRound(inputBuffer[i] * inputGainFactor()),
|
||||||
std::numeric_limits<int16_t>::max());
|
std::numeric_limits<int16_t>::max());
|
||||||
|
|
||||||
buf[i] = static_cast<int16_t>(ampPCM);
|
inputBuffer[i] = static_cast<int16_t>(ampPCM);
|
||||||
}
|
}
|
||||||
|
|
||||||
emit Audio::frameAvailable(buf, AUDIO_FRAME_SAMPLE_COUNT, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE);
|
emit Audio::frameAvailable(inputBuffer, AUDIO_FRAME_SAMPLE_COUNT, channels, AUDIO_SAMPLE_RATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -106,11 +106,12 @@ protected:
|
||||||
bool initInput(const QString& deviceName, uint32_t channels);
|
bool initInput(const QString& deviceName, uint32_t channels);
|
||||||
virtual void doAudio();
|
virtual void doAudio();
|
||||||
|
|
||||||
|
float getVolume();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual bool initInput(const QString& deviceName);
|
virtual bool initInput(const QString& deviceName);
|
||||||
virtual bool initOutput(const QString& outDevDescr);
|
virtual bool initOutput(const QString& outDevDescr);
|
||||||
void playMono16SoundCleanup();
|
void playMono16SoundCleanup();
|
||||||
float getVolume(int16_t *buf);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QThread* audioThread;
|
QThread* audioThread;
|
||||||
|
@ -127,6 +128,7 @@ protected:
|
||||||
bool outputInitialized = false;
|
bool outputInitialized = false;
|
||||||
|
|
||||||
QList<ALuint> peerSources;
|
QList<ALuint> peerSources;
|
||||||
|
int channels = 0;
|
||||||
qreal gain = 0;
|
qreal gain = 0;
|
||||||
qreal gainFactor = 1;
|
qreal gainFactor = 1;
|
||||||
qreal minInGain = -30;
|
qreal minInGain = -30;
|
||||||
|
@ -137,6 +139,7 @@ protected:
|
||||||
QTimer voiceTimer;
|
QTimer voiceTimer;
|
||||||
qreal minInThreshold = 0.0;
|
qreal minInThreshold = 0.0;
|
||||||
qreal maxInThreshold = 0.4;
|
qreal maxInThreshold = 0.4;
|
||||||
|
int16_t* inputBuffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // OPENAL_H
|
#endif // OPENAL_H
|
||||||
|
|
|
@ -361,23 +361,33 @@ void OpenAL2::doInput()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t buf[AUDIO_FRAME_SAMPLE_COUNT];
|
alcCaptureSamples(alInDev, inputBuffer, AUDIO_FRAME_SAMPLE_COUNT);
|
||||||
alcCaptureSamples(alInDev, buf, AUDIO_FRAME_SAMPLE_COUNT);
|
|
||||||
|
|
||||||
if (echoCancelSupported && filterer) {
|
if (echoCancelSupported && filterer) {
|
||||||
filter_audio(filterer, buf, AUDIO_FRAME_SAMPLE_COUNT);
|
filter_audio(filterer, inputBuffer, AUDIO_FRAME_SAMPLE_COUNT);
|
||||||
|
}
|
||||||
|
|
||||||
|
float volume = getVolume();
|
||||||
|
if (volume >= inputThreshold) {
|
||||||
|
isActive = true;
|
||||||
|
emit startActive(voiceHold);
|
||||||
|
}
|
||||||
|
|
||||||
|
emit Audio::volumeAvailable(volume);
|
||||||
|
if (!isActive) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// gain amplification with clipping to 16-bit boundaries
|
// gain amplification with clipping to 16-bit boundaries
|
||||||
for (quint32 i = 0; i < AUDIO_FRAME_SAMPLE_COUNT; ++i) {
|
for (quint32 i = 0; i < AUDIO_FRAME_SAMPLE_COUNT; ++i) {
|
||||||
int ampPCM = qBound<int>(std::numeric_limits<int16_t>::min(),
|
int ampPCM = qBound<int>(std::numeric_limits<int16_t>::min(),
|
||||||
qRound(buf[i] * OpenAL::inputGainFactor()),
|
qRound(inputBuffer[i] * OpenAL::inputGainFactor()),
|
||||||
std::numeric_limits<int16_t>::max());
|
std::numeric_limits<int16_t>::max());
|
||||||
|
|
||||||
buf[i] = static_cast<int16_t>(ampPCM);
|
inputBuffer[i] = static_cast<int16_t>(ampPCM);
|
||||||
}
|
}
|
||||||
|
|
||||||
emit Audio::frameAvailable(buf, AUDIO_FRAME_SAMPLE_COUNT, 1, AUDIO_SAMPLE_RATE);
|
emit Audio::frameAvailable(inputBuffer, AUDIO_FRAME_SAMPLE_COUNT, 1, AUDIO_SAMPLE_RATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue
Block a user