Loading include/media/MmapStreamInterface.h +15 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ #include <utils/Errors.h> #include <utils/RefBase.h> #include <time.h> namespace android { class MmapStreamCallback; Loading Loading @@ -102,6 +104,19 @@ class MmapStreamInterface : public virtual RefBase */ virtual status_t getMmapPosition(struct audio_mmap_position *position) = 0; /** * Get a recent count of the number of audio frames presented/received to/from an * external observer. * * \param[out] position count of presented audio frames * \param[out] timeNanos associated clock time * * \return OK if the external position is set correctly. * NO_INIT in case of initialization error * INVALID_OPERATION if the interface is not implemented */ virtual status_t getExternalPosition(uint64_t* position, int64_t* timeNanos) = 0; /** * Start a stream operating in mmap mode. * createMmapBuffer() must be called before calling start() Loading services/audioflinger/AudioFlinger.h +1 −0 Original line number Diff line number Diff line Loading @@ -684,6 +684,7 @@ using effect_buffer_t = int16_t; virtual status_t createMmapBuffer(int32_t minSizeFrames, struct audio_mmap_buffer_info *info); virtual status_t getMmapPosition(struct audio_mmap_position *position); virtual status_t getExternalPosition(uint64_t *position, int64_t *timeNanos); virtual status_t start(const AudioClient& client, const audio_attributes_t *attr, audio_port_handle_t *handle); Loading services/audioflinger/Threads.cpp +28 −0 Original line number Diff line number Diff line Loading @@ -8746,6 +8746,11 @@ status_t AudioFlinger::MmapThreadHandle::getMmapPosition(struct audio_mmap_posit return mThread->getMmapPosition(position); } status_t AudioFlinger::MmapThreadHandle::getExternalPosition(uint64_t *position, int64_t *timeNanos) { return mThread->getExternalPosition(position, timeNanos); } status_t AudioFlinger::MmapThreadHandle::start(const AudioClient& client, const audio_attributes_t *attr, audio_port_handle_t *handle) Loading Loading @@ -9703,6 +9708,20 @@ void AudioFlinger::MmapPlaybackThread::toAudioPortConfig(struct audio_port_confi } } status_t AudioFlinger::MmapPlaybackThread::getExternalPosition(uint64_t *position, int64_t *timeNanos) { if (mOutput == nullptr) { return NO_INIT; } struct timespec timestamp; status_t status = mOutput->getPresentationPosition(position, ×tamp); if (status == NO_ERROR) { *timeNanos = timestamp.tv_sec * NANOS_PER_SECOND + timestamp.tv_nsec; } return status; } void AudioFlinger::MmapPlaybackThread::dumpInternals_l(int fd, const Vector<String16>& args) { MmapThread::dumpInternals_l(fd, args); Loading Loading @@ -9807,4 +9826,13 @@ void AudioFlinger::MmapCaptureThread::toAudioPortConfig(struct audio_port_config } } status_t AudioFlinger::MmapCaptureThread::getExternalPosition( uint64_t *position, int64_t *timeNanos) { if (mInput == nullptr) { return NO_INIT; } return mInput->getCapturePosition((int64_t*)position, timeNanos); } } // namespace android services/audioflinger/Threads.h +5 −0 Original line number Diff line number Diff line Loading @@ -1824,6 +1824,7 @@ class MmapThread : public ThreadBase audio_port_handle_t *handle); status_t stop(audio_port_handle_t handle); status_t standby(); virtual status_t getExternalPosition(uint64_t *position, int64_t *timeNaos) = 0; // RefBase virtual void onFirstRef(); Loading Loading @@ -1935,6 +1936,8 @@ public: virtual void toAudioPortConfig(struct audio_port_config *config); status_t getExternalPosition(uint64_t *position, int64_t *timeNanos) override; protected: void dumpInternals_l(int fd, const Vector<String16>& args) override; Loading Loading @@ -1965,6 +1968,8 @@ public: virtual void toAudioPortConfig(struct audio_port_config *config); status_t getExternalPosition(uint64_t *position, int64_t *timeNanos) override; protected: AudioStreamIn* mInput; Loading services/oboeservice/AAudioServiceEndpointMMAP.cpp +15 −0 Original line number Diff line number Diff line Loading @@ -378,3 +378,18 @@ aaudio_result_t AAudioServiceEndpointMMAP::getDownDataDescription(AudioEndpointP parcelable.mDownDataQueueParcelable.setCapacityInFrames(getBufferCapacity()); return AAUDIO_OK; } aaudio_result_t AAudioServiceEndpointMMAP::getExternalPosition(uint64_t *positionFrames, int64_t *timeNanos) { if (!mExternalPositionSupported) { return AAUDIO_ERROR_INVALID_STATE; } status_t status = mMmapStream->getExternalPosition(positionFrames, timeNanos); if (status == INVALID_OPERATION) { // getExternalPosition is not supported. Set mExternalPositionSupported as false // so that the call will not go to the HAL next time. mExternalPositionSupported = false; } return AAudioConvert_androidToAAudioResult(status); } Loading
include/media/MmapStreamInterface.h +15 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ #include <utils/Errors.h> #include <utils/RefBase.h> #include <time.h> namespace android { class MmapStreamCallback; Loading Loading @@ -102,6 +104,19 @@ class MmapStreamInterface : public virtual RefBase */ virtual status_t getMmapPosition(struct audio_mmap_position *position) = 0; /** * Get a recent count of the number of audio frames presented/received to/from an * external observer. * * \param[out] position count of presented audio frames * \param[out] timeNanos associated clock time * * \return OK if the external position is set correctly. * NO_INIT in case of initialization error * INVALID_OPERATION if the interface is not implemented */ virtual status_t getExternalPosition(uint64_t* position, int64_t* timeNanos) = 0; /** * Start a stream operating in mmap mode. * createMmapBuffer() must be called before calling start() Loading
services/audioflinger/AudioFlinger.h +1 −0 Original line number Diff line number Diff line Loading @@ -684,6 +684,7 @@ using effect_buffer_t = int16_t; virtual status_t createMmapBuffer(int32_t minSizeFrames, struct audio_mmap_buffer_info *info); virtual status_t getMmapPosition(struct audio_mmap_position *position); virtual status_t getExternalPosition(uint64_t *position, int64_t *timeNanos); virtual status_t start(const AudioClient& client, const audio_attributes_t *attr, audio_port_handle_t *handle); Loading
services/audioflinger/Threads.cpp +28 −0 Original line number Diff line number Diff line Loading @@ -8746,6 +8746,11 @@ status_t AudioFlinger::MmapThreadHandle::getMmapPosition(struct audio_mmap_posit return mThread->getMmapPosition(position); } status_t AudioFlinger::MmapThreadHandle::getExternalPosition(uint64_t *position, int64_t *timeNanos) { return mThread->getExternalPosition(position, timeNanos); } status_t AudioFlinger::MmapThreadHandle::start(const AudioClient& client, const audio_attributes_t *attr, audio_port_handle_t *handle) Loading Loading @@ -9703,6 +9708,20 @@ void AudioFlinger::MmapPlaybackThread::toAudioPortConfig(struct audio_port_confi } } status_t AudioFlinger::MmapPlaybackThread::getExternalPosition(uint64_t *position, int64_t *timeNanos) { if (mOutput == nullptr) { return NO_INIT; } struct timespec timestamp; status_t status = mOutput->getPresentationPosition(position, ×tamp); if (status == NO_ERROR) { *timeNanos = timestamp.tv_sec * NANOS_PER_SECOND + timestamp.tv_nsec; } return status; } void AudioFlinger::MmapPlaybackThread::dumpInternals_l(int fd, const Vector<String16>& args) { MmapThread::dumpInternals_l(fd, args); Loading Loading @@ -9807,4 +9826,13 @@ void AudioFlinger::MmapCaptureThread::toAudioPortConfig(struct audio_port_config } } status_t AudioFlinger::MmapCaptureThread::getExternalPosition( uint64_t *position, int64_t *timeNanos) { if (mInput == nullptr) { return NO_INIT; } return mInput->getCapturePosition((int64_t*)position, timeNanos); } } // namespace android
services/audioflinger/Threads.h +5 −0 Original line number Diff line number Diff line Loading @@ -1824,6 +1824,7 @@ class MmapThread : public ThreadBase audio_port_handle_t *handle); status_t stop(audio_port_handle_t handle); status_t standby(); virtual status_t getExternalPosition(uint64_t *position, int64_t *timeNaos) = 0; // RefBase virtual void onFirstRef(); Loading Loading @@ -1935,6 +1936,8 @@ public: virtual void toAudioPortConfig(struct audio_port_config *config); status_t getExternalPosition(uint64_t *position, int64_t *timeNanos) override; protected: void dumpInternals_l(int fd, const Vector<String16>& args) override; Loading Loading @@ -1965,6 +1968,8 @@ public: virtual void toAudioPortConfig(struct audio_port_config *config); status_t getExternalPosition(uint64_t *position, int64_t *timeNanos) override; protected: AudioStreamIn* mInput; Loading
services/oboeservice/AAudioServiceEndpointMMAP.cpp +15 −0 Original line number Diff line number Diff line Loading @@ -378,3 +378,18 @@ aaudio_result_t AAudioServiceEndpointMMAP::getDownDataDescription(AudioEndpointP parcelable.mDownDataQueueParcelable.setCapacityInFrames(getBufferCapacity()); return AAUDIO_OK; } aaudio_result_t AAudioServiceEndpointMMAP::getExternalPosition(uint64_t *positionFrames, int64_t *timeNanos) { if (!mExternalPositionSupported) { return AAUDIO_ERROR_INVALID_STATE; } status_t status = mMmapStream->getExternalPosition(positionFrames, timeNanos); if (status == INVALID_OPERATION) { // getExternalPosition is not supported. Set mExternalPositionSupported as false // so that the call will not go to the HAL next time. mExternalPositionSupported = false; } return AAudioConvert_androidToAAudioResult(status); }