// // AudioScope.h // interace/src/audio // // Created by Stephen Birarda on 2014-12-16. // Copyright 2014 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // #ifndef hifi_AudioScope_h #define hifi_AudioScope_h #include #include #include #include #include class AudioScope : public QObject, public Dependency { Q_OBJECT SINGLETON_DEPENDENCY /*@jsdoc * The AudioScope API provides facilities for an audio scope. * * @namespace AudioScope * * @deprecated This API doesn't work properly. It is deprecated and will be removed. * * @hifi-interface * @hifi-client-entity * @hifi-avatar * * @property {number[]} scopeInput - Scope input. Read-only. * @property {number[]} scopeOutputLeft - Scope left output. Read-only. * @property {number[]} scopeOutputRight - Scope right output. Read-only. * @property {number[]} triggerInput - Trigger input. Read-only. * @property {number[]} triggerOutputLeft - Trigger left output. Read-only. * @property {number[]} triggerOutputRight - Trigger right output. Read-only. */ Q_PROPERTY(QVector scopeInput READ getScopeInput) Q_PROPERTY(QVector scopeOutputLeft READ getScopeOutputLeft) Q_PROPERTY(QVector scopeOutputRight READ getScopeOutputRight) Q_PROPERTY(QVector triggerInput READ getTriggerInput) Q_PROPERTY(QVector triggerOutputLeft READ getTriggerOutputLeft) Q_PROPERTY(QVector triggerOutputRight READ getTriggerOutputRight) public: // Audio scope methods for allocation/deallocation void allocateScope(); void freeScope(); void reallocateScope(int frames); public slots: /*@jsdoc * Toggle. * @function AudioScope.toggle */ void toggle() { setVisible(!_isEnabled); } /*@jsdoc * Set visible. * @function AudioScope.setVisible * @param {boolean} visible - Visible. */ void setVisible(bool visible); /*@jsdoc * Get visible. * @function AudioScope.getVisible * @returns {boolean} Visible. */ bool getVisible() const { return _isEnabled; } /*@jsdoc * Toggle pause. * @function AudioScope.togglePause */ void togglePause() { setPause(!_isPaused); } /*@jsdoc * Set pause. * @function AudioScope.setPause * @param {boolean} pause - Pause. */ void setPause(bool paused) { _isPaused = paused; emit pauseChanged(); } /*@jsdoc * Get pause. * @function AudioScope.getPause * @returns {boolean} Pause. */ bool getPause() { return _isPaused; } /*@jsdoc * Toggle trigger. * @function AudioScope.toggleTrigger */ void toggleTrigger() { _autoTrigger = !_autoTrigger; } /*@jsdoc * Get auto trigger. * @function AudioScope.getAutoTrigger * @returns {boolean} Auto trigger. */ bool getAutoTrigger() { return _autoTrigger; } /*@jsdoc * Set auto trigger. * @function AudioScope.setAutoTrigger * @param {boolean} autoTrigger - Auto trigger. */ void setAutoTrigger(bool autoTrigger) { _isTriggered = false; _autoTrigger = autoTrigger; } /*@jsdoc * Set trigger values. * @function AudioScope.setTriggerValues * @param {number} x - X. * @param {number} y - Y. */ void setTriggerValues(int x, int y) { _triggerValues.x = x; _triggerValues.y = y; } /*@jsdoc * Set triggered. * @function AudioScope.setTriggered * @param {boolean} triggered - Triggered. */ void setTriggered(bool triggered) { _isTriggered = triggered; } /*@jsdoc * Get triggered. * @function AudioScope.getTriggered * @returns {boolean} Triggered. */ bool getTriggered() { return _isTriggered; } /*@jsdoc * Get frames per second. * @function AudioScope.getFramesPerSecond * @returns {number} Frames per second. */ float getFramesPerSecond(); /*@jsdoc * Get frames per scope. * @function AudioScope.getFramesPerScope * @returns {number} Frames per scope. */ int getFramesPerScope() { return _framesPerScope; } /*@jsdoc * Select five frames audio scope. * @function AudioScope.selectAudioScopeFiveFrames */ void selectAudioScopeFiveFrames(); /*@jsdoc * Select twenty frames audio scope. * @function AudioScope.selectAudioScopeTwentyFrames */ void selectAudioScopeTwentyFrames(); /*@jsdoc * Select fifty frames audio scope. * @function AudioScope.selectAudioScopeFiftyFrames */ void selectAudioScopeFiftyFrames(); /*@jsdoc * Get scope input. * @function AudioScope.getScopeInput * @returns {number[]} Scope input. */ QVector getScopeInput() { return _scopeInputData; }; /*@jsdoc * Get scope left output. * @function AudioScope.getScopeOutputLeft * @returns {number[]} Scope left output. */ QVector getScopeOutputLeft() { return _scopeOutputLeftData; }; /*@jsdoc * Get scope right output. * @function AudioScope.getScopeOutputRight * @returns {number[]} Scope right output. */ QVector getScopeOutputRight() { return _scopeOutputRightData; }; /*@jsdoc * Get trigger input. * @function AudioScope.getTriggerInput * @returns {number[]} Trigger input. */ QVector getTriggerInput() { return _triggerInputData; }; /*@jsdoc * Get left trigger output. * @function AudioScope.getTriggerOutputLeft * @returns {number[]} Left trigger output. */ QVector getTriggerOutputLeft() { return _triggerOutputLeftData; }; /*@jsdoc * Get right trigger output. * @function AudioScope.getTriggerOutputRight * @returns {number[]} Right trigger output. */ QVector getTriggerOutputRight() { return _triggerOutputRightData; }; /*@jsdoc * Set local echo. * @function AudioScope.setLocalEcho * @parm {boolean} localEcho - Local echo. */ void setLocalEcho(bool localEcho); /*@jsdoc * Set server echo. * @function AudioScope.setServerEcho * @parm {boolean} serverEcho - Server echo. */ void setServerEcho(bool serverEcho); signals: /*@jsdoc * Triggered when pause changes. * @function AudioScope.pauseChanged * @returns {Signal} */ void pauseChanged(); /*@jsdoc * Triggered when scope is triggered. * @function AudioScope.triggered * @returns {Signal} */ void triggered(); protected: AudioScope(); private slots: void addStereoSilenceToScope(int silentSamplesPerChannel); void addLastFrameRepeatedWithFadeToScope(int samplesPerChannel); void addStereoSamplesToScope(const QByteArray& samples); void addInputToScope(const QByteArray& inputSamples); private: // Audio scope methods for data acquisition int addBufferToScope(QByteArray* byteArray, int frameOffset, const int16_t* source, int sourceSamples, unsigned int sourceChannel, unsigned int sourceNumberOfChannels, float fade = 1.0f); int addSilenceToScope(QByteArray* byteArray, int frameOffset, int silentSamples); QVector getScopeVector(const QByteArray* scope, int offset); bool shouldTrigger(const QVector& scope); void computeInputData(); void computeOutputData(); void storeTriggerValues(); bool _isEnabled; bool _isPaused; bool _isTriggered; bool _autoTrigger; int _scopeInputOffset; int _scopeOutputOffset; int _framesPerScope; int _samplesPerScope; QByteArray* _scopeInput; QByteArray* _scopeOutputLeft; QByteArray* _scopeOutputRight; QByteArray _scopeLastFrame; QVector _scopeInputData; QVector _scopeOutputLeftData; QVector _scopeOutputRightData; QVector _triggerInputData; QVector _triggerOutputLeftData; QVector _triggerOutputRightData; glm::ivec2 _triggerValues; int _audioScopeBackground; int _audioScopeGrid; int _inputID; int _outputLeftID; int _outputRightD; }; #endif // hifi_AudioScope_h