Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b66815f3 authored by Eric Laurent's avatar Eric Laurent Committed by android-build-merger
Browse files

aaudio: enable exclusive MMAP mode support

am: d51329ec

Change-Id: I7b618a0073c1bada8c263ab9c56baf54698f5e10
parents c2080aba d51329ec
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -48,8 +48,8 @@ int main(int argc, char **argv)
    //aaudio_performance_mode_t requestedPerformanceMode = AAUDIO_PERFORMANCE_MODE_NONE;
    const aaudio_performance_mode_t requestedPerformanceMode = AAUDIO_PERFORMANCE_MODE_LOW_LATENCY;
    //aaudio_performance_mode_t requestedPerformanceMode = AAUDIO_PERFORMANCE_MODE_POWER_SAVING;
    const aaudio_sharing_mode_t requestedSharingMode = AAUDIO_SHARING_MODE_SHARED;
    //const aaudio_sharing_mode_t requestedSharingMode = AAUDIO_SHARING_MODE_EXCLUSIVE;
    //const aaudio_sharing_mode_t requestedSharingMode = AAUDIO_SHARING_MODE_SHARED;
    const aaudio_sharing_mode_t requestedSharingMode = AAUDIO_SHARING_MODE_EXCLUSIVE;
    aaudio_sharing_mode_t actualSharingMode;

    AAudioStream *aaudioStream = nullptr;
@@ -70,7 +70,7 @@ int main(int argc, char **argv)

    printf("%s - Monitor input level using AAudio\n", argv[0]);

//    AAudio_setMMapPolicy(AAUDIO_POLICY_ALWAYS);
    AAudio_setMMapPolicy(AAUDIO_POLICY_ALWAYS);

    recorder.setPerformanceMode(requestedPerformanceMode);
    recorder.setSharingMode(requestedSharingMode);
+4 −4
Original line number Diff line number Diff line
@@ -27,15 +27,15 @@
#define SAMPLE_RATE           48000
#define NUM_SECONDS           4

#define MMAP_POLICY              AAUDIO_UNSPECIFIED
//#define MMAP_POLICY              AAUDIO_UNSPECIFIED
//#define MMAP_POLICY              AAUDIO_POLICY_NEVER
//#define MMAP_POLICY              AAUDIO_POLICY_AUTO
//#define MMAP_POLICY              AAUDIO_POLICY_ALWAYS
#define MMAP_POLICY              AAUDIO_POLICY_ALWAYS

#define REQUESTED_FORMAT         AAUDIO_FORMAT_PCM_I16

#define REQUESTED_SHARING_MODE   AAUDIO_SHARING_MODE_SHARED
//#define REQUESTED_SHARING_MODE   AAUDIO_SHARING_MODE_EXCLUSIVE
//#define REQUESTED_SHARING_MODE   AAUDIO_SHARING_MODE_SHARED
#define REQUESTED_SHARING_MODE   AAUDIO_SHARING_MODE_EXCLUSIVE


int main(int argc, char **argv)
+1 −0
Original line number Diff line number Diff line
@@ -115,6 +115,7 @@ aaudio_result_t AudioStreamInternal::open(const AudioStreamBuilder &builder) {
        setSampleRate(configuration.getSampleRate());
        setSamplesPerFrame(configuration.getSamplesPerFrame());
        setDeviceId(configuration.getDeviceId());
        setSharingMode(configuration.getSharingMode());

        // Save device format so we can do format conversion and volume scaling together.
        mDeviceFormat = configuration.getAudioFormat();
+1 −1
Original line number Diff line number Diff line
@@ -107,7 +107,7 @@ aaudio_handle_t AAudioService::openStream(const aaudio::AAudioStreamRequest &req
    }

    if (sharingMode == AAUDIO_SHARING_MODE_EXCLUSIVE) {
        serviceStream = new AAudioServiceStreamMMAP();
        serviceStream = new AAudioServiceStreamMMAP(mCachedUserId);
        result = serviceStream->open(request, configurationOutput);
        if (result != AAUDIO_OK) {
            // fall back to using a shared stream
+25 −6
Original line number Diff line number Diff line
@@ -41,11 +41,12 @@ using namespace aaudio;
 * Service Stream that uses an MMAP buffer.
 */

AAudioServiceStreamMMAP::AAudioServiceStreamMMAP()
AAudioServiceStreamMMAP::AAudioServiceStreamMMAP(uid_t serviceUid)
        : AAudioServiceStreamBase()
        , mMmapStreamCallback(new MyMmapStreamCallback(*this))
        , mPreviousFrameCounter(0)
        , mMmapStream(nullptr) {
        , mMmapStream(nullptr)
        , mCachedUserId(serviceUid) {
}

AAudioServiceStreamMMAP::~AAudioServiceStreamMMAP() {
@@ -153,10 +154,29 @@ aaudio_result_t AAudioServiceStreamMMAP::open(const aaudio::AAudioStreamRequest
              status);
        return AAUDIO_ERROR_UNAVAILABLE;
    } else {
        ALOGD("createMmapBuffer status %d shared_address = %p buffer_size %d burst_size %d",
        ALOGD("createMmapBuffer status %d shared_address = %p buffer_size %d burst_size %d"
                "Sharable FD: %s",
              status, mMmapBufferinfo.shared_memory_address,
              mMmapBufferinfo.buffer_size_frames,
              mMmapBufferinfo.burst_size_frames);
              abs(mMmapBufferinfo.buffer_size_frames),
              mMmapBufferinfo.burst_size_frames,
              mMmapBufferinfo.buffer_size_frames < 0 ? "Yes" : "No");
    }

    mCapacityInFrames = mMmapBufferinfo.buffer_size_frames;
    // FIXME: the audio HAL indicates if the shared memory fd can be shared outside of audioserver
    // by returning a negative buffer size
    if (mCapacityInFrames < 0) {
        // Exclusive mode is possible from any client
        mCapacityInFrames = -mCapacityInFrames;
    } else {
        // exclusive mode is only possible if the final fd destination is inside audioserver
        if ((mMmapClient.clientUid != mCachedUserId) &&
                configurationInput.getSharingMode() == AAUDIO_SHARING_MODE_EXCLUSIVE) {
            // Fallback is handled by caller but indicate what is possible in case
            // this is used in the future
            configurationOutput.setSharingMode(AAUDIO_SHARING_MODE_SHARED);
            return AAUDIO_ERROR_UNAVAILABLE;
        }
    }

    // Get information about the stream and pass it back to the caller.
@@ -166,7 +186,6 @@ aaudio_result_t AAudioServiceStreamMMAP::open(const aaudio::AAudioStreamRequest

    mAudioDataFileDescriptor = mMmapBufferinfo.shared_memory_fd;
    mFramesPerBurst = mMmapBufferinfo.burst_size_frames;
    mCapacityInFrames = mMmapBufferinfo.buffer_size_frames;
    mAudioFormat = AAudioConvert_androidToAAudioDataFormat(config.format);
    mSampleRate = config.sample_rate;

Loading