Fixed issue with calling setOptions

Since the stereo option is computed from the .wav file, if you call
setOptions later (like the cow.js does), it resets stereo to false.
So, I now just copy the stereo flag into the new options, since the
sound file is the same.

Also, calling AudioClient::outputLocalInjector on the AudioClient
thread now to avoid potential concurrency issues accessing the
vector of injectors.
This commit is contained in:
David Kelly 2016-07-13 11:28:36 -07:00
parent 8f41b8a5c9
commit c951f507e3
3 changed files with 33 additions and 15 deletions

View file

@ -823,7 +823,6 @@ void AudioClient::mixLocalAudioInjectors(int16_t* inputBuffer) {
} else {
qDebug() << "injector has no more data, marking finished for removal";
injector->finish();
injectorsToRemove.append(injector);
}
@ -831,7 +830,6 @@ void AudioClient::mixLocalAudioInjectors(int16_t* inputBuffer) {
} else {
qDebug() << "injector has no local buffer, marking as finished for removal";
injector->finish();
injectorsToRemove.append(injector);
}
@ -933,15 +931,24 @@ void AudioClient::setIsStereoInput(bool isStereoInput) {
bool AudioClient::outputLocalInjector(bool isStereo, AudioInjector* injector) {
if (injector->getLocalBuffer() && _audioInput ) {
// just add it to the vector of active local injectors
// TODO: deal with concurrency perhaps? Maybe not
qDebug() << "adding new injector!!!!!!!";
_activeLocalAudioInjectors.append(injector);
// just add it to the vector of active local injectors, if
// not already there.
// Since this is invoked with invokeMethod, there _should_ be
// no reason to lock access to the vector of injectors.
if (!_activeLocalAudioInjectors.contains(injector)) {
qDebug() << "adding new injector";
_activeLocalAudioInjectors.append(injector);
} else {
qDebug() << "injector exists in active list already";
}
return true;
}
return false;
} else {
// no local buffer or audio
return false;
}
}
void AudioClient::outputFormatChanged() {

View file

@ -26,6 +26,8 @@
#include "AudioInjector.h"
int audioInjectorPtrMetaTypeId = qRegisterMetaType<AudioInjector*>();
AudioInjector::AudioInjector(QObject* parent) :
QObject(parent)
{
@ -41,11 +43,20 @@ AudioInjector::AudioInjector(const Sound& sound, const AudioInjectorOptions& inj
AudioInjector::AudioInjector(const QByteArray& audioData, const AudioInjectorOptions& injectorOptions) :
_audioData(audioData),
_options(injectorOptions)
_options(injectorOptions)
{
}
void AudioInjector::setOptions(const AudioInjectorOptions& options) {
// since options.stereo is computed from the audio stream,
// we need to copy it from existing options just in case.
bool currentlyStereo = _options.stereo;
_options = options;
_options.stereo = currentlyStereo;
}
void AudioInjector::finish() {
bool shouldDelete = (_state == State::NotFinishedWithPendingDelete);
_state = State::Finished;
@ -115,11 +126,11 @@ void AudioInjector::restart() {
_hasSetup = false;
_shouldStop = false;
_state = State::NotFinished;
// call inject audio to start injection over again
setupInjection();
// if we're a local injector call inject locally to start injecting again
// if we're a local injector, just inject again
if (_options.localOnly) {
injectLocally();
} else {
@ -145,7 +156,8 @@ bool AudioInjector::injectLocally() {
// give our current send position to the local buffer
_localBuffer->setCurrentOffset(_currentSendOffset);
success = _localAudioInterface->outputLocalInjector(_options.stereo, this);
// call this function on the AudioClient's thread
success = QMetaObject::invokeMethod(_localAudioInterface, "outputLocalInjector", Q_ARG(bool, _options.stereo), Q_ARG(AudioInjector*, this));
if (!success) {
qCDebug(audio) << "AudioInjector::injectLocally could not output locally via _localAudioInterface";

View file

@ -75,7 +75,7 @@ public slots:
void stopAndDeleteLater();
const AudioInjectorOptions& getOptions() const { return _options; }
void setOptions(const AudioInjectorOptions& options) { _options = options; }
void setOptions(const AudioInjectorOptions& options);
float getLoudness() const { return _loudness; }
bool isPlaying() const { return _state == State::NotFinished || _state == State::NotFinishedWithPendingDelete; }
@ -111,5 +111,4 @@ private:
friend class AudioInjectorManager;
};
#endif // hifi_AudioInjector_h