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

Commit 4b2fcd8a authored by Eric Laurent's avatar Eric Laurent
Browse files

audio policy for concurrent capture.

First implementation of concurrent capture policy:
Initially, only capture for HOTWORD or FM TUNER sources or
re-route submix is allowed at the same time as any other capture.
Several capture clients can share the same input stream. In this case
active clients are sorted by audio source priority level and the input
path configuration and routing is driven by the highest priority
active source.

Bug: 22702906

Change-Id: Icbedfe001c6243ecad7a7b57ab78d893b2b97402
parent a03910b2
Loading
Loading
Loading
Loading
+10 −1
Original line number Original line Diff line number Diff line
@@ -67,6 +67,14 @@ public:
        API_INPUT_TELEPHONY_RX, // used for capture from telephony RX path
        API_INPUT_TELEPHONY_RX, // used for capture from telephony RX path
    } input_type_t;
    } input_type_t;


   enum {
        API_INPUT_CONCURRENCY_NONE = 0,
        API_INPUT_CONCURRENCY_CALL = (1 << 0),      // Concurrency with a call
        API_INPUT_CONCURRENCY_CAPTURE = (1 << 1),   // Concurrency with another capture
   };

   typedef uint32_t concurrency_type__mask_t;

public:
public:
    virtual ~AudioPolicyInterface() {}
    virtual ~AudioPolicyInterface() {}
    //
    //
@@ -140,7 +148,8 @@ public:
                                     input_type_t *inputType) = 0;
                                     input_type_t *inputType) = 0;
    // indicates to the audio policy manager that the input starts being used.
    // indicates to the audio policy manager that the input starts being used.
    virtual status_t startInput(audio_io_handle_t input,
    virtual status_t startInput(audio_io_handle_t input,
                                audio_session_t session) = 0;
                                audio_session_t session,
                                concurrency_type__mask_t *concurrency) = 0;
    // indicates to the audio policy manager that the input stops being used.
    // indicates to the audio policy manager that the input stops being used.
    virtual status_t stopInput(audio_io_handle_t input,
    virtual status_t stopInput(audio_io_handle_t input,
                               audio_session_t session) = 0;
                               audio_session_t session) = 0;
+40 −2
Original line number Original line Diff line number Diff line
@@ -30,9 +30,9 @@ static const audio_format_t gDynamicFormat = AUDIO_FORMAT_DEFAULT;


/**
/**
 * A device mask for all audio input devices that are considered "virtual" when evaluating
 * A device mask for all audio input devices that are considered "virtual" when evaluating
 * active inputs in getActiveInput()
 * active inputs in getActiveInputs()
 */
 */
#define APM_AUDIO_IN_DEVICE_VIRTUAL_ALL  (AUDIO_DEVICE_IN_REMOTE_SUBMIX|AUDIO_DEVICE_IN_FM_TUNER)
#define APM_AUDIO_IN_DEVICE_VIRTUAL_ALL  (AUDIO_DEVICE_IN_REMOTE_SUBMIX)




/**
/**
@@ -88,3 +88,41 @@ static inline bool device_distinguishes_on_address(audio_devices_t device)
           (((device & AUDIO_DEVICE_BIT_IN) == 0) &&
           (((device & AUDIO_DEVICE_BIT_IN) == 0) &&
            ((device & APM_AUDIO_DEVICE_OUT_MATCH_ADDRESS_ALL) != 0));
            ((device & APM_AUDIO_DEVICE_OUT_MATCH_ADDRESS_ALL) != 0));
}
}

/**
 * Returns the priority of a given audio source for capture. The priority is used when more than one
 * capture session is active on a given input stream to determine which session drives routing and
 * effect configuration.
 *
 * @param[in] inputSource to consider. Valid sources are:
 * - AUDIO_SOURCE_VOICE_COMMUNICATION
 * - AUDIO_SOURCE_CAMCORDER
 * - AUDIO_SOURCE_MIC
 * - AUDIO_SOURCE_FM_TUNER
 * - AUDIO_SOURCE_VOICE_RECOGNITION
 * - AUDIO_SOURCE_HOTWORD
 *
 * @return the corresponding input source priority or 0 if priority is irrelevant for this source.
 *      This happens when the specified source cannot share a given input stream (e.g remote submix)
 *      The higher the value, the higher the priority.
 */
static inline int32_t source_priority(audio_source_t inputSource)
{
    switch (inputSource) {
    case AUDIO_SOURCE_VOICE_COMMUNICATION:
        return 6;
    case AUDIO_SOURCE_CAMCORDER:
        return 5;
    case AUDIO_SOURCE_MIC:
        return 4;
    case AUDIO_SOURCE_FM_TUNER:
        return 3;
    case AUDIO_SOURCE_VOICE_RECOGNITION:
        return 2;
    case AUDIO_SOURCE_HOTWORD:
        return 1;
    default:
        break;
    }
    return 0;
}
+3 −2
Original line number Original line Diff line number Diff line
@@ -63,7 +63,8 @@ public:
                             const sp<AudioSession>& audioSession);
                             const sp<AudioSession>& audioSession);
    status_t removeAudioSession(audio_session_t session);
    status_t removeAudioSession(audio_session_t session);
    sp<AudioSession> getAudioSession(audio_session_t session) const;
    sp<AudioSession> getAudioSession(audio_session_t session) const;
    AudioSessionCollection getActiveAudioSessions() const;
    AudioSessionCollection getAudioSessions(bool activeOnly) const;
    audio_source_t getHighestPrioritySource(bool activeOnly) const;


private:
private:
    audio_port_handle_t           mId;
    audio_port_handle_t           mId;
@@ -93,7 +94,7 @@ public:
     * Only considers inputs from physical devices (e.g. main mic, headset mic) when
     * Only considers inputs from physical devices (e.g. main mic, headset mic) when
     * ignoreVirtualInputs is true.
     * ignoreVirtualInputs is true.
     */
     */
    audio_io_handle_t getActiveInput(bool ignoreVirtualInputs = true);
    Vector<sp <AudioInputDescriptor> > getActiveInputs(bool ignoreVirtualInputs = true);


    audio_devices_t getSupportedDevices(audio_io_handle_t handle) const;
    audio_devices_t getSupportedDevices(audio_io_handle_t handle) const;


+4 −0
Original line number Original line Diff line number Diff line
@@ -159,6 +159,10 @@ public:
    virtual void toAudioPortConfig(struct audio_port_config *dstConfig,
    virtual void toAudioPortConfig(struct audio_port_config *dstConfig,
                                   const struct audio_port_config *srcConfig = NULL) const = 0;
                                   const struct audio_port_config *srcConfig = NULL) const = 0;
    virtual sp<AudioPort> getAudioPort() const = 0;
    virtual sp<AudioPort> getAudioPort() const = 0;
    virtual bool hasSameHwModuleAs(const sp<AudioPortConfig>& other) const {
        return (other != 0) &&
                (other->getAudioPort()->getModuleHandle() == getAudioPort()->getModuleHandle());
    }
    uint32_t mSamplingRate;
    uint32_t mSamplingRate;
    audio_format_t mFormat;
    audio_format_t mFormat;
    audio_channel_mask_t mChannelMask;
    audio_channel_mask_t mChannelMask;
+1 −0
Original line number Original line Diff line number Diff line
@@ -87,6 +87,7 @@ public:
    AudioSessionCollection getActiveSessions() const;
    AudioSessionCollection getActiveSessions() const;
    bool hasActiveSession() const;
    bool hasActiveSession() const;
    bool isSourceActive(audio_source_t source) const;
    bool isSourceActive(audio_source_t source) const;
    audio_source_t getHighestPrioritySource(bool activeOnly) const;


    status_t dump(int fd, int spaces) const;
    status_t dump(int fd, int spaces) const;
};
};
Loading