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

Commit 46bc1286 authored by Scott Randolph's avatar Scott Randolph
Browse files

Define new AudioControl HAL for automotive.

This provides a mechanism for Android to interact with a car's
audio subsystem.
It is a partial replacement for the deprecated AUDIO_* properties in VehicleHal.
It also provides control over fade/balance.

Bug: 31623564
Test: build for bat_land.  VTS tests in future CL.
Change-Id: I4344cce3a6aa9a28d1327bf4d16bd080c7fd3f50
parent a5f9f8b1
Loading
Loading
Loading
Loading
+23 −0
Original line number Original line Diff line number Diff line
// This file is autogenerated by hidl-gen -Landroidbp.

hidl_interface {
    name: "android.hardware.automotive.audiocontrol@1.0",
    root: "android.hardware",
    vndk: {
        enabled: true,
    },
    srcs: [
        "types.hal",
        "IAudioControl.hal",
        "IAudioControlCallback.hal",
    ],
    interfaces: [
        "android.hidl.base@1.0",
    ],
    types: [
        "AudioResult",
        "ContextNumber",
    ],
    gen_java: true,
}
+73 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.hardware.automotive.audiocontrol@1.0;

import IAudioControlCallback;


/**
 * Interacts with the car's audio subsystem to manage audio sources and volumes
 */
interface IAudioControl {

    /**
     * Registers the required callback object so that we can be notified when the state
     * of the car's audio system changes. This call must be made when the interface is
     * initialized.
     */
    setCallback(IAudioControlCallback notificationObject)
        generates (AudioResult result);


    /**
     * Called at startup once per context to get the mapping from ContextNumber to
     * busAddress. This lets the car tell the framework to which physical output stream
     * each context should be routed.
     *
     * For every context, a valid bus number (0 - num busses-1) must be returned. If an
     * unrecognized contextNumber is encountered, then -1 shall be returned.
     *
     * Any context for which an invalid busNumber is returned must be routed to bus 0.
     */
    getBusForContext(uint32_t contextNumber)
        generates (int32_t busNumber);


    /**
     * Control the right/left balance setting of the car speakers.
     *
     * This is intended to shift the speaker volume toward the right (+) or left (-) side of
     * the car. 0.0 means "centered". +1.0 means fully right. -1.0 means fully left.
     *
     * A value outside the range -1 to 1 must be clamped by the implementation to the -1 to 1
     * range.
     */
    oneway setBalanceTowardRight(float value);


    /**
     * Control the fore/aft fade setting of the car speakers.
     *
     * This is intended to shift the speaker volume toward the front (+) or back (-) of the car.
     * 0.0 means "centered". +1.0 means fully forward. -1.0 means fully rearward.
     *
     * A value outside the range -1 to 1 must be clamped by the implementation to the -1 to 1
     * range.
     */
    oneway setFadeTowardFront(float value);
};
+57 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.hardware.automotive.audiocontrol@1.0;


/**
 * Implemented on client (framework) side to receive asynchronous updates from the car.
 */
interface IAudioControlCallback {

    /**
     * When the HAL makes this call, any apps currently playing must be asked to
     * temporarily suspend playback (via an AudioManager::AUDIOFOCUS_LOSS_TRANSIENT event).
     *
     * This is only a suggestion. Apps may be slow to react or even ignore this message
     * entirely. Enforcement, if necessary, must be done at the AudioHAL level as the
     * samples are delivered. In most instances, this is the way a car should ask for
     * quiet if it needs it for some important situation, such as warning alarms or chimes.
     */
    oneway suggestPausePlayers();


    /**
     * When the HAL makes this case, any apps currently playing must be asked to stop
     * playing (via an AudioManager::AUDIOFOCUS_LOSS event). Once stopped, the apps must
     * not resume their playback.
     *
     * It should be noted that not all apps or sound sources honor this request, but this
     * at least gives an app the chance to do the right thing.
     * Because it premanently stops media, this call is expected to be used only rarely.
     * Perhaps in the event of an E-call, where resuming music might be undesirable assuming
     * the driver is now dealing with whatever the emergency is?
     */
    oneway suggestStopPlayers();


    /**
     * Receives calls from the HAL when Android should resume normal operations. If the previous
     * action was a requestPausePlayers, then things that were paused must be told they may
     * resume.
     */
    oneway resumePlayers();
};
+40 −0
Original line number Original line Diff line number Diff line
// Copyright (C) 2017 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

cc_binary {
    name: "android.hardware.automotive.audiocontrol@1.0-service",
    defaults: ["hidl_defaults"],
    vendor: true,
    relative_install_path: "hw",
    srcs: [
        "AudioControl.cpp",
        "AudioControlCallback.cpp",
        "service.cpp"
    ],
    init_rc: ["android.hardware.automotive.audiocontrol@1.0-service.rc"],

    shared_libs: [
        "android.hardware.automotive.audiocontrol@1.0",
        "libhidlbase",
        "libhidltransport",
        "liblog",
        "libutils",
    ],

    cflags: [
        "-DLOG_TAG=\"AudCntrlDrv\"",
        "-O0",
        "-g",
    ],
}
+86 −0
Original line number Original line Diff line number Diff line
#include "AudioControl.h"

#include <hidl/HidlTransportSupport.h>
#include <log/log.h>


namespace android {
namespace hardware {
namespace automotive {
namespace audiocontrol {
namespace V1_0 {
namespace implementation {


// This is the static map we're using to associate a ContextNumber with a
// bus number from the audio_policy_configuration.xml setup.  Every valid context needs
// to be mapped to a bus address that actually exists in the platforms configuration.
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*a))  // Would be nice if this were common...
static int sContextToBusMap[] = {
    -1,     // INVALID
     0,     // MUSIC_CONTEXT
     1,     // NAVIGATION_CONTEXT
     2,     // VOICE_COMMAND_CONTEXT
     3,     // CALL_RING_CONTEXT
     4,     // CALL_CONTEXT
     5,     // ALARM_CONTEXT
     6,     // NOTIFICATION_CONTEXT
     7,     // SYSTEM_SOUND_CONTEXT
};
static const unsigned sContextMapSize = ARRAY_SIZE(sContextToBusMap);
static const unsigned sContextCount = sContextMapSize - 1;  // Less one for the INVALID entry
static const unsigned sContextNumberMax = sContextCount;    // contextNumber is counted from 1


AudioControl::AudioControl() {
};


// Methods from ::android::hardware::automotive::audiocontrol::V1_0::IAudioControl follow.
Return<AudioResult> AudioControl::setCallback(const sp<IAudioControlCallback>& notificationObject) {
    // Hang onto the provided callback object for future use
    callback = notificationObject;

    return AudioResult::OK;
}


Return<int32_t> AudioControl::getBusForContext(uint32_t contextNumber) {
    if (contextNumber > sContextNumberMax) {
        ALOGE("Unexpected context number %d (max expected is %d)", contextNumber, sContextCount);
        return -1;
    } else {
        return sContextToBusMap[contextNumber];
    }
}


Return<void> AudioControl::setBalanceTowardRight(float value) {
    // For completeness, lets bounds check the input...
    if ((value > 1.0f) || (value < -1.0f)) {
        ALOGE("Balance value out of range -1 to 1 at %0.2f", value);
    } else {
        // Just log in this default mock implementation
        ALOGI("Balance set to %0.2f", value);
    }
    return Void();
}


Return<void> AudioControl::setFadeTowardFront(float value) {
    // For completeness, lets bounds check the input...
    if ((value > 1.0f) || (value < -1.0f)) {
        ALOGE("Fader value out of range -1 to 1 at %0.2f", value);
    } else {
        // Just log in this default mock implementation
        ALOGI("Fader set to %0.2f", value);
    }
    return Void();
}

}  // namespace implementation
}  // namespace V1_0
}  // namespace audiocontrol
}  // namespace automotive
}  // namespace hardware
}  // namespace android
Loading