aaudio: lower latency using MMAP capture
MMAP can be enabled by setting system properties.
Bug: 38267780
Test: input_monitor.cpp
Change-Id: I5e86fd1d9baef4fe59837ccbca7971acbb54d8b5
Signed-off-by: Phil Burk <philburk@google.com>
diff --git a/services/oboeservice/AAudioServiceEndpoint.h b/services/oboeservice/AAudioServiceEndpoint.h
index d0c2f53..50bf049 100644
--- a/services/oboeservice/AAudioServiceEndpoint.h
+++ b/services/oboeservice/AAudioServiceEndpoint.h
@@ -23,6 +23,7 @@
#include <vector>
#include "client/AudioStreamInternal.h"
+#include "client/AudioStreamInternalPlay.h"
#include "binding/AAudioServiceMessage.h"
#include "AAudioServiceStreamShared.h"
#include "AAudioServiceStreamMMAP.h"
@@ -33,14 +34,13 @@
class AAudioServiceEndpoint {
public:
- explicit AAudioServiceEndpoint(android::AAudioService &audioService);
- virtual ~AAudioServiceEndpoint();
+ virtual ~AAudioServiceEndpoint() = default;
- aaudio_result_t open(int32_t deviceId, aaudio_direction_t direction);
+ virtual aaudio_result_t open(int32_t deviceId);
- int32_t getSampleRate() const { return mStreamInternal.getSampleRate(); }
- int32_t getSamplesPerFrame() const { return mStreamInternal.getSamplesPerFrame(); }
- int32_t getFramesPerBurst() const { return mStreamInternal.getFramesPerBurst(); }
+ int32_t getSampleRate() const { return mStreamInternal->getSampleRate(); }
+ int32_t getSamplesPerFrame() const { return mStreamInternal->getSamplesPerFrame(); }
+ int32_t getFramesPerBurst() const { return mStreamInternal->getFramesPerBurst(); }
aaudio_result_t registerStream(AAudioServiceStreamShared *sharedStream);
aaudio_result_t unregisterStream(AAudioServiceStreamShared *sharedStream);
@@ -48,13 +48,13 @@
aaudio_result_t stopStream(AAudioServiceStreamShared *sharedStream);
aaudio_result_t close();
- int32_t getDeviceId() const { return mStreamInternal.getDeviceId(); }
+ int32_t getDeviceId() const { return mStreamInternal->getDeviceId(); }
- aaudio_direction_t getDirection() const { return mStreamInternal.getDirection(); }
+ aaudio_direction_t getDirection() const { return mStreamInternal->getDirection(); }
void disconnectRegisteredStreams();
- void *callbackLoop();
+ virtual void *callbackLoop() = 0;
// This should only be called from the AAudioEndpointManager under a mutex.
int32_t getReferenceCount() const {
@@ -66,23 +66,21 @@
mReferenceCount = count;
}
-private:
- aaudio_result_t startMixer_l();
- aaudio_result_t stopMixer_l();
-
- int64_t calculateReasonableTimeout(int32_t framesPerOperation);
-
- AudioStreamInternal mStreamInternal;
- AAudioMixer mMixer;
+ virtual AudioStreamInternal *getStreamInternal() = 0;
std::atomic<bool> mCallbackEnabled;
- int32_t mReferenceCount = 0;
- bool mLatencyTuningEnabled = false; // TODO implement tuning
std::mutex mLockStreams;
+
std::vector<AAudioServiceStreamShared *> mRegisteredStreams;
std::vector<AAudioServiceStreamShared *> mRunningStreams;
+private:
+ aaudio_result_t startSharingThread_l();
+ aaudio_result_t stopSharingThread();
+
+ AudioStreamInternal *mStreamInternal = nullptr;
+ int32_t mReferenceCount = 0;
};
} /* namespace aaudio */