// // Created by Bradley Austin Davis on 2015/11/13 // Copyright 2015 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_RecordingScriptingInterface_h #define hifi_RecordingScriptingInterface_h #include #include #include #include #include #include #include #include class QScriptEngine; class QScriptValue; /**jsdoc * @namespace Recording * * @hifi-interface * @hifi-client-entity * @hifi-avatar * @hifi-assignment-client */ class RecordingScriptingInterface : public QObject, public Dependency { Q_OBJECT public: RecordingScriptingInterface(); public slots: /**jsdoc * @function Recording.loadRecording * @param {string} url * @param {Recording~loadRecordingCallback} [callback=null] */ /**jsdoc * Called when {@link Recording.loadRecording} is complete. * @callback Recording~loadRecordingCallback * @param {boolean} success * @param {string} url */ void loadRecording(const QString& url, QScriptValue callback = QScriptValue()); /**jsdoc * @function Recording.startPlaying */ void startPlaying(); /**jsdoc * @function Recording.pausePlayer */ void pausePlayer(); /**jsdoc * @function Recording.stopPlaying */ void stopPlaying(); /**jsdoc * @function Recording.isPlaying * @returns {boolean} */ bool isPlaying() const; /**jsdoc * @function Recording.isPaused * @returns {boolean} */ bool isPaused() const; /**jsdoc * @function Recording.playerElapsed * @returns {number} */ float playerElapsed() const; /**jsdoc * @function Recording.playerLength * @returns {number} */ float playerLength() const; /**jsdoc * Sets the playback audio volume. * @function Recording.setPlayerVolume * @param {number} volume - The playback audio volume, range 0.01.0. */ void setPlayerVolume(float volume); /**jsdoc * @function Recording.setPlayerAudioOffset * @param {number} audioOffset */ void setPlayerAudioOffset(float audioOffset); /**jsdoc * @function Recording.setPlayerTime * @param {number} time */ void setPlayerTime(float time); /**jsdoc * @function Recording.setPlayerLoop * @param {boolean} loop */ void setPlayerLoop(bool loop); /**jsdoc * @function Recording.setPlayerUseDisplayName * @param {boolean} useDisplayName */ void setPlayerUseDisplayName(bool useDisplayName); /**jsdoc * @function Recording.setPlayerUseAttachments * @param {boolean} useAttachments */ void setPlayerUseAttachments(bool useAttachments); /**jsdoc * @function Recording.setPlayerUseHeadModel * @param {boolean} useHeadModel * @todo Note: This function currently has no effect. */ void setPlayerUseHeadModel(bool useHeadModel); /**jsdoc * @function Recording.setPlayerUseSkeletonModel * @param {boolean} useSkeletonModel * @todo Note: This function currently doesn't work. */ void setPlayerUseSkeletonModel(bool useSkeletonModel); /**jsdoc * @function Recording.setPlayFromCurrentLocation * @param {boolean} playFromCurrentLocation */ void setPlayFromCurrentLocation(bool playFromCurrentLocation); /**jsdoc * @function Recording.getPlayerUseDisplayName * @returns {boolean} */ bool getPlayerUseDisplayName() { return _useDisplayName; } /**jsdoc * @function Recording.getPlayerUseAttachments * @returns {boolean} */ bool getPlayerUseAttachments() { return _useAttachments; } /**jsdoc * @function Recording.getPlayerUseHeadModel * @returns {boolean} */ bool getPlayerUseHeadModel() { return _useHeadModel; } /**jsdoc * @function Recording.getPlayerUseSkeletonModel * @returns {boolean} */ bool getPlayerUseSkeletonModel() { return _useSkeletonModel; } /**jsdoc * @function Recording.getPlayFromCurrentLocation * @returns {boolean} */ bool getPlayFromCurrentLocation() { return _playFromCurrentLocation; } /**jsdoc * @function Recording.startRecording */ void startRecording(); /**jsdoc * @function Recording.stopRecording */ void stopRecording(); /**jsdoc * @function Recording.isRecording * @returns {boolean} */ bool isRecording() const; /**jsdoc * @function Recording.recorderElapsed * @returns {number} */ float recorderElapsed() const; /**jsdoc * @function Recording.getDefaultRecordingSaveDirectory * @returns {string} */ QString getDefaultRecordingSaveDirectory(); /**jsdoc * @function Recording.saveRecording * @param {string} filename */ void saveRecording(const QString& filename); /**jsdoc * @function Recording.saveRecordingToAsset * @param {function} getClipAtpUrl */ bool saveRecordingToAsset(QScriptValue getClipAtpUrl); /**jsdoc * @function Recording.loadLastRecording */ void loadLastRecording(); protected: using Mutex = std::recursive_mutex; using Locker = std::unique_lock; using Flag = std::atomic; QSharedPointer _player; QSharedPointer _recorder; Flag _playFromCurrentLocation { true }; Flag _useDisplayName { false }; Flag _useHeadModel { false }; Flag _useAttachments { false }; Flag _useSkeletonModel { false }; recording::ClipPointer _lastClip; QSet _clipLoaders; private: void playClip(recording::NetworkClipLoaderPointer clipLoader, const QString& url, QScriptValue callback); }; #endif // hifi_RecordingScriptingInterface_h