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

Commit 50b8ccb5 authored by Ytai Ben-Tsvi's avatar Ytai Ben-Tsvi Committed by Ytai Ben-tsvi
Browse files

AIDLize IAudioFlinger

This change removes all the manual parceling code used in the
IAudioFlinger interface. In order to reduce impact on existing client
and server code to a minimum, the IAudioFlinger interface is preserved
and a new translation layer between IAudioFlinger and its AIDL
counterpart, IAudioFlingerService, is introduced:
- AudioFlingerClientAdapter is for use on the client side. It wraps an
  IAudioFlingerService instance and presents an IAudioFlinger
  interface.
- AudioFlingerServerAdapter is for use on the server side. It wraps an
  IAudioFlinger instance and presents an IAudioFlingerService.

Argument conversion an error checking is performed rigorously in the
translation layer.

Test: Audio-related CTS tests from CtsMediaTestCases
Bug: 160253486
Change-Id: Ibe35317e449b0faa3ef5336bb30f669106978a31
parent ee75d6f3
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -208,6 +208,21 @@ private:
    int32_t mDirectionality;
};

// Conversion routines, according to AidlConversion.h conventions.
inline ConversionResult<MicrophoneInfo>
aidl2legacy_MicrophoneInfo(const media::MicrophoneInfoData& aidl) {
    MicrophoneInfo legacy;
    RETURN_IF_ERROR(legacy.readFromParcelable(aidl));
    return legacy;
}

inline ConversionResult<media::MicrophoneInfoData>
legacy2aidl_MicrophoneInfo(const MicrophoneInfo& legacy) {
    media::MicrophoneInfoData aidl;
    RETURN_IF_ERROR(legacy.writeToParcelable(&aidl));
    return aidl;
}

} // namespace media
} // namespace android

+100 −0
Original line number Diff line number Diff line
@@ -236,6 +236,14 @@ ConversionResult<int32_t> legacy2aidl_audio_unique_id_t_int32_t(audio_unique_id_
    return convertReinterpret<int32_t>(legacy);
}

ConversionResult<audio_hw_sync_t> aidl2legacy_int32_t_audio_hw_sync_t(int32_t aidl) {
    return convertReinterpret<audio_hw_sync_t>(aidl);
}

ConversionResult<int32_t> legacy2aidl_audio_hw_sync_t_int32_t(audio_hw_sync_t legacy) {
    return convertReinterpret<int32_t>(legacy);
}

ConversionResult<pid_t> aidl2legacy_int32_t_pid_t(int32_t aidl) {
    return convertReinterpret<pid_t>(aidl);
}
@@ -2082,4 +2090,96 @@ legacy2aidl_audio_port_v7_AudioPort(const audio_port_v7& legacy) {
    return aidl;
}

ConversionResult<audio_mode_t>
aidl2legacy_AudioMode_audio_mode_t(media::AudioMode aidl) {
    switch (aidl) {
        case media::AudioMode::INVALID:
            return AUDIO_MODE_INVALID;
        case media::AudioMode::CURRENT:
            return AUDIO_MODE_CURRENT;
        case media::AudioMode::NORMAL:
            return AUDIO_MODE_NORMAL;
        case media::AudioMode::RINGTONE:
            return AUDIO_MODE_RINGTONE;
        case media::AudioMode::IN_CALL:
            return AUDIO_MODE_IN_CALL;
        case media::AudioMode::IN_COMMUNICATION:
            return AUDIO_MODE_IN_COMMUNICATION;
        case media::AudioMode::CALL_SCREEN:
            return AUDIO_MODE_CALL_SCREEN;
    }
    return unexpected(BAD_VALUE);
}

ConversionResult<media::AudioMode>
legacy2aidl_audio_mode_t_AudioMode(audio_mode_t legacy) {
    switch (legacy) {
        case AUDIO_MODE_INVALID:
            return media::AudioMode::INVALID;
        case AUDIO_MODE_CURRENT:
            return media::AudioMode::CURRENT;
        case AUDIO_MODE_NORMAL:
            return media::AudioMode::NORMAL;
        case AUDIO_MODE_RINGTONE:
            return media::AudioMode::RINGTONE;
        case AUDIO_MODE_IN_CALL:
            return media::AudioMode::IN_CALL;
        case AUDIO_MODE_IN_COMMUNICATION:
            return media::AudioMode::IN_COMMUNICATION;
        case AUDIO_MODE_CALL_SCREEN:
            return media::AudioMode::CALL_SCREEN;
        case AUDIO_MODE_CNT:
            break;
    }
    return unexpected(BAD_VALUE);
}

ConversionResult<audio_unique_id_use_t>
aidl2legacy_AudioUniqueIdUse_audio_unique_id_use_t(media::AudioUniqueIdUse aidl) {
    switch (aidl) {
        case media::AudioUniqueIdUse::UNSPECIFIED:
            return AUDIO_UNIQUE_ID_USE_UNSPECIFIED;
        case media::AudioUniqueIdUse::SESSION:
            return AUDIO_UNIQUE_ID_USE_SESSION;
        case media::AudioUniqueIdUse::MODULE:
            return AUDIO_UNIQUE_ID_USE_MODULE;
        case media::AudioUniqueIdUse::EFFECT:
            return AUDIO_UNIQUE_ID_USE_EFFECT;
        case media::AudioUniqueIdUse::PATCH:
            return AUDIO_UNIQUE_ID_USE_PATCH;
        case media::AudioUniqueIdUse::OUTPUT:
            return AUDIO_UNIQUE_ID_USE_OUTPUT;
        case media::AudioUniqueIdUse::INPUT:
            return AUDIO_UNIQUE_ID_USE_INPUT;
        case media::AudioUniqueIdUse::CLIENT:
            return AUDIO_UNIQUE_ID_USE_CLIENT;
    }
    return unexpected(BAD_VALUE);
}

ConversionResult<media::AudioUniqueIdUse>
legacy2aidl_audio_unique_id_use_t_AudioUniqueIdUse(audio_unique_id_use_t legacy) {
    switch (legacy) {
        case AUDIO_UNIQUE_ID_USE_UNSPECIFIED:
            return media::AudioUniqueIdUse::UNSPECIFIED;
        case AUDIO_UNIQUE_ID_USE_SESSION:
            return media::AudioUniqueIdUse::SESSION;
        case AUDIO_UNIQUE_ID_USE_MODULE:
            return media::AudioUniqueIdUse::MODULE;
        case AUDIO_UNIQUE_ID_USE_EFFECT:
            return media::AudioUniqueIdUse::EFFECT;
        case AUDIO_UNIQUE_ID_USE_PATCH:
            return media::AudioUniqueIdUse::PATCH;
        case AUDIO_UNIQUE_ID_USE_OUTPUT:
            return media::AudioUniqueIdUse::OUTPUT;
        case AUDIO_UNIQUE_ID_USE_INPUT:
            return media::AudioUniqueIdUse::INPUT;
        case AUDIO_UNIQUE_ID_USE_CLIENT:
            return media::AudioUniqueIdUse::CLIENT;
        case AUDIO_UNIQUE_ID_USE_MAX:
            break;
    }
    return unexpected(BAD_VALUE);
}

}  // namespace android
+2 −0
Original line number Diff line number Diff line
@@ -347,7 +347,9 @@ aidl_interface {
        "aidl/android/media/OpenInputResponse.aidl",
        "aidl/android/media/OpenOutputRequest.aidl",
        "aidl/android/media/OpenOutputResponse.aidl",
        "aidl/android/media/RenderPosition.aidl",

        "aidl/android/media/IAudioFlingerService.aidl",
        "aidl/android/media/IAudioFlingerClient.aidl",
        "aidl/android/media/IAudioRecord.aidl",
        "aidl/android/media/IAudioTrack.aidl",
+3 −2
Original line number Diff line number Diff line
@@ -71,7 +71,7 @@ const sp<IAudioFlinger> AudioSystem::get_audio_flinger()
            sp<IServiceManager> sm = defaultServiceManager();
            sp<IBinder> binder;
            do {
                binder = sm->getService(String16("media.audio_flinger"));
                binder = sm->getService(String16(IAudioFlinger::DEFAULT_SERVICE_NAME));
                if (binder != 0)
                    break;
                ALOGW("AudioFlinger not published, waiting...");
@@ -83,7 +83,8 @@ const sp<IAudioFlinger> AudioSystem::get_audio_flinger()
                reportNoError = true;
            }
            binder->linkToDeath(gAudioFlingerClient);
            gAudioFlinger = interface_cast<IAudioFlinger>(binder);
            gAudioFlinger = new AudioFlingerClientAdapter(
                    interface_cast<media::IAudioFlingerService>(binder));
            LOG_ALWAYS_FATAL_IF(gAudioFlinger == 0);
            afc = gAudioFlingerClient;
            // Make sure callbacks can be received by gAudioFlingerClient
+917 −1211

File changed.

Preview size limit exceeded, changes collapsed.

Loading