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

Commit 39f02ddf authored by Phil Burk's avatar Phil Burk
Browse files

aaudio: fix EXCLUSIVE mode interfering with SHARED

The MMAP endpoints were not tracked by the EndpointManager
so it could not broker EXCLUSIVE access. To fix this the MMAP stream
was refactored to use a per-client stream and a per-device endpoint.

Cleanup close() of MMAP stream.
Add AAudioServiceEndpointShared.cpp.
Extract AAudioServiceEndpointMMAP from AAudioServiceStreamMMAP.
Track MMAP endpoints so we can manage EXCLUSIVE and SHARED access.

Bug: 64494572
Bug: 64310586
Test: see bug, use write_sine to play a shared stream and a excl stream
Change-Id: I5053193abfd9b8a69a2f7e1110739d65e2af5d64
Merged-In: I5053193abfd9b8a69a2f7e1110739d65e2af5d64
parent ee079fe2
Loading
Loading
Loading
Loading
+6 −1
Original line number Original line Diff line number Diff line
@@ -46,6 +46,8 @@ status_t AAudioStreamConfiguration::writeToParcel(Parcel* parcel) const {
    if (status != NO_ERROR) goto error;
    if (status != NO_ERROR) goto error;
    status = parcel->writeInt32((int32_t) getFormat());
    status = parcel->writeInt32((int32_t) getFormat());
    if (status != NO_ERROR) goto error;
    if (status != NO_ERROR) goto error;
    status = parcel->writeInt32((int32_t) getDirection());
    if (status != NO_ERROR) goto error;
    status = parcel->writeInt32(getBufferCapacity());
    status = parcel->writeInt32(getBufferCapacity());
    if (status != NO_ERROR) goto error;
    if (status != NO_ERROR) goto error;
    return NO_ERROR;
    return NO_ERROR;
@@ -73,6 +75,9 @@ status_t AAudioStreamConfiguration::readFromParcel(const Parcel* parcel) {
    setFormat(value);
    setFormat(value);
    status = parcel->readInt32(&value);
    status = parcel->readInt32(&value);
    if (status != NO_ERROR) goto error;
    if (status != NO_ERROR) goto error;
    setDirection((aaudio_direction_t) value);
    status = parcel->readInt32(&value);
    if (status != NO_ERROR) goto error;
    setBufferCapacity(value);
    setBufferCapacity(value);
    return NO_ERROR;
    return NO_ERROR;
error:
error:
+0 −8
Original line number Original line Diff line number Diff line
@@ -46,9 +46,6 @@ status_t AAudioStreamRequest::writeToParcel(Parcel* parcel) const {
    status_t status = parcel->writeInt32((int32_t) mUserId);
    status_t status = parcel->writeInt32((int32_t) mUserId);
    if (status != NO_ERROR) goto error;
    if (status != NO_ERROR) goto error;


    status = parcel->writeInt32((int32_t) mDirection);
    if (status != NO_ERROR) goto error;

    status = parcel->writeBool(mSharingModeMatchRequired);
    status = parcel->writeBool(mSharingModeMatchRequired);
    if (status != NO_ERROR) goto error;
    if (status != NO_ERROR) goto error;


@@ -71,10 +68,6 @@ status_t AAudioStreamRequest::readFromParcel(const Parcel* parcel) {
    if (status != NO_ERROR) goto error;
    if (status != NO_ERROR) goto error;
    mUserId = (uid_t) temp;
    mUserId = (uid_t) temp;


    status = parcel->readInt32(&temp);
    if (status != NO_ERROR) goto error;
    mDirection = (aaudio_direction_t) temp;

    status = parcel->readBool(&mSharingModeMatchRequired);
    status = parcel->readBool(&mSharingModeMatchRequired);
    if (status != NO_ERROR) goto error;
    if (status != NO_ERROR) goto error;


@@ -98,7 +91,6 @@ aaudio_result_t AAudioStreamRequest::validate() const {
void AAudioStreamRequest::dump() const {
void AAudioStreamRequest::dump() const {
    ALOGD("AAudioStreamRequest mUserId    = %d", mUserId);
    ALOGD("AAudioStreamRequest mUserId    = %d", mUserId);
    ALOGD("AAudioStreamRequest mProcessId = %d", mProcessId);
    ALOGD("AAudioStreamRequest mProcessId = %d", mProcessId);
    ALOGD("AAudioStreamRequest mDirection = %d", mDirection);
    ALOGD("AAudioStreamRequest mSharingModeMatchRequired = %d", mSharingModeMatchRequired);
    ALOGD("AAudioStreamRequest mSharingModeMatchRequired = %d", mSharingModeMatchRequired);
    ALOGD("AAudioStreamRequest mInService = %d", mInService);
    ALOGD("AAudioStreamRequest mInService = %d", mInService);
    mConfiguration.dump();
    mConfiguration.dump();
+2 −11
Original line number Original line Diff line number Diff line
@@ -52,14 +52,6 @@ public:
        mProcessId = processId;
        mProcessId = processId;
    }
    }


    aaudio_direction_t getDirection() const {
        return mDirection;
    }

    void setDirection(aaudio_direction_t direction) {
        mDirection = direction;
    }

    bool isSharingModeMatchRequired() const {
    bool isSharingModeMatchRequired() const {
        return mSharingModeMatchRequired;
        return mSharingModeMatchRequired;
    }
    }
@@ -94,9 +86,8 @@ public:


protected:
protected:
    AAudioStreamConfiguration  mConfiguration;
    AAudioStreamConfiguration  mConfiguration;
    uid_t                      mUserId;
    uid_t                      mUserId = (uid_t) -1;
    pid_t                      mProcessId;
    pid_t                      mProcessId = (pid_t) -1;
    aaudio_direction_t         mDirection;
    bool                       mSharingModeMatchRequired = false;
    bool                       mSharingModeMatchRequired = false;
    bool                       mInService = false; // Stream opened by AAudioservice
    bool                       mInService = false; // Stream opened by AAudioservice
};
};
+2 −1
Original line number Original line Diff line number Diff line
@@ -105,13 +105,13 @@ aaudio_result_t AudioStreamInternal::open(const AudioStreamBuilder &builder) {
    // Build the request to send to the server.
    // Build the request to send to the server.
    request.setUserId(getuid());
    request.setUserId(getuid());
    request.setProcessId(getpid());
    request.setProcessId(getpid());
    request.setDirection(getDirection());
    request.setSharingModeMatchRequired(isSharingModeMatchRequired());
    request.setSharingModeMatchRequired(isSharingModeMatchRequired());
    request.setInService(mInService);
    request.setInService(mInService);


    request.getConfiguration().setDeviceId(getDeviceId());
    request.getConfiguration().setDeviceId(getDeviceId());
    request.getConfiguration().setSampleRate(getSampleRate());
    request.getConfiguration().setSampleRate(getSampleRate());
    request.getConfiguration().setSamplesPerFrame(getSamplesPerFrame());
    request.getConfiguration().setSamplesPerFrame(getSamplesPerFrame());
    request.getConfiguration().setDirection(getDirection());
    request.getConfiguration().setSharingMode(getSharingMode());
    request.getConfiguration().setSharingMode(getSharingMode());


    request.getConfiguration().setBufferCapacity(builder.getBufferCapacity());
    request.getConfiguration().setBufferCapacity(builder.getBufferCapacity());
@@ -357,6 +357,7 @@ aaudio_result_t AudioStreamInternal::startClient(const android::AudioClient& cli
    if (mServiceStreamHandle == AAUDIO_HANDLE_INVALID) {
    if (mServiceStreamHandle == AAUDIO_HANDLE_INVALID) {
        return AAUDIO_ERROR_INVALID_STATE;
        return AAUDIO_ERROR_INVALID_STATE;
    }
    }

    return mServiceInterface.startClient(mServiceStreamHandle, client, clientHandle);
    return mServiceInterface.startClient(mServiceStreamHandle, client, clientHandle);
}
}


+4 −0
Original line number Original line Diff line number Diff line
@@ -93,6 +93,10 @@ public:


    aaudio_result_t stopClient(audio_port_handle_t clientHandle);
    aaudio_result_t stopClient(audio_port_handle_t clientHandle);


    aaudio_handle_t getServiceHandle() const {
        return mServiceStreamHandle;
    }

protected:
protected:


    aaudio_result_t processData(void *buffer,
    aaudio_result_t processData(void *buffer,
Loading