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

Commit 23e617d0 authored by Eric Laurent's avatar Eric Laurent Committed by Android (Google) Code Review
Browse files

Merge "audio policy: use client descriptors"

parents 9366193e 8fc147b2
Loading
Loading
Loading
Loading
+6 −15
Original line number Diff line number Diff line
@@ -124,17 +124,11 @@ public:
                                        audio_port_handle_t *selectedDeviceId,
                                        audio_port_handle_t *portId) = 0;
    // indicates to the audio policy manager that the output starts being used by corresponding stream.
    virtual status_t startOutput(audio_io_handle_t output,
                                 audio_stream_type_t stream,
                                 audio_session_t session) = 0;
    virtual status_t startOutput(audio_port_handle_t portId) = 0;
    // indicates to the audio policy manager that the output stops being used by corresponding stream.
    virtual status_t stopOutput(audio_io_handle_t output,
                                audio_stream_type_t stream,
                                audio_session_t session) = 0;
    virtual status_t stopOutput(audio_port_handle_t portId) = 0;
    // releases the output.
    virtual void releaseOutput(audio_io_handle_t output,
                               audio_stream_type_t stream,
                               audio_session_t session) = 0;
    virtual void releaseOutput(audio_port_handle_t portId) = 0;

    // request an input appropriate for record from the supplied device with supplied parameters.
    virtual status_t getInputForAttr(const audio_attributes_t *attr,
@@ -147,16 +141,13 @@ public:
                                     input_type_t *inputType,
                                     audio_port_handle_t *portId) = 0;
    // indicates to the audio policy manager that the input starts being used.
    virtual status_t startInput(audio_io_handle_t input,
                                audio_session_t session,
    virtual status_t startInput(audio_port_handle_t portId,
                                bool silenced,
                                concurrency_type__mask_t *concurrency) = 0;
    // indicates to the audio policy manager that the input stops being used.
    virtual status_t stopInput(audio_io_handle_t input,
                               audio_session_t session) = 0;
    virtual status_t stopInput(audio_port_handle_t portId) = 0;
    // releases the input.
    virtual void releaseInput(audio_io_handle_t input,
                              audio_session_t session) = 0;
    virtual void releaseInput(audio_port_handle_t portId) = 0;

    //
    // volume control functions
+9 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include "AudioIODescriptorInterface.h"
#include "AudioPort.h"
#include "AudioSession.h"
#include "ClientDescriptor.h"
#include <utils/Errors.h>
#include <system/audio.h>
#include <utils/SortedVector.h>
@@ -88,6 +89,9 @@ public:
    void stop();
    void close();

    RecordClientMap& clients() { return mClients; }
    RecordClientVector getClientsForSession(audio_session_t session);

 private:

    void updateSessionRecordingConfiguration(int event, const sp<AudioSession>& audioSession);
@@ -105,6 +109,8 @@ private:
    SortedVector<audio_session_t> mPreemptedSessions;
    AudioPolicyClientInterface *mClientInterface;
    uint32_t mGlobalRefCount;  // non-session-specific ref count

    RecordClientMap mClients;
};

class AudioInputCollection :
@@ -128,6 +134,8 @@ public:

    audio_devices_t getSupportedDevices(audio_io_handle_t handle) const;

    sp<AudioInputDescriptor> getInputForClient(audio_port_handle_t portId);

    status_t dump(int fd) const;
};

+9 −3
Original line number Diff line number Diff line
@@ -17,14 +17,15 @@
#pragma once

#include <sys/types.h>
#include "AudioPort.h"
#include <RoutingStrategy.h>
#include <utils/Errors.h>
#include <utils/Timers.h>
#include <utils/KeyedVector.h>
#include <system/audio.h>
#include <RoutingStrategy.h>
#include "AudioIODescriptorInterface.h"
#include "AudioPort.h"
#include "AudioSourceDescriptor.h"
#include "ClientDescriptor.h"

namespace android {

@@ -78,6 +79,8 @@ public:
    audio_patch_handle_t getPatchHandle() const override;
    void setPatchHandle(audio_patch_handle_t handle) override;

    TrackClientMap& clients() { return mClients; }

    sp<AudioPort> mPort;
    audio_devices_t mDevice;                   // current device this output is routed to
    uint32_t mRefCount[AUDIO_STREAM_CNT]; // number of streams of each type using this output
@@ -91,6 +94,7 @@ public:
protected:
    audio_patch_handle_t mPatchHandle;
    audio_port_handle_t mId;
    TrackClientMap mClients;
};

// Audio output driven by a software mixer in audio flinger.
@@ -226,6 +230,8 @@ public:

    audio_devices_t getSupportedDevices(audio_io_handle_t handle) const;

    sp<SwAudioOutputDescriptor> getOutputForClient(audio_port_handle_t portId);

    status_t dump(int fd) const;
};

+14 −3
Original line number Diff line number Diff line
@@ -16,12 +16,15 @@

#pragma once

#include <vector>
#include <map>
#include <unistd.h>
#include <sys/types.h>

#include <system/audio.h>
#include <utils/Errors.h>
#include <utils/RefBase.h>
#include <utils/String8.h>

namespace android {

@@ -35,7 +38,8 @@ public:
        mConfig(config), mPreferredDeviceId(preferredDeviceId), mActive(false) {}
    ~ClientDescriptor() override = default;

    virtual status_t  dump(int fd);
    status_t dump(int fd, int spaces, int index);
    virtual status_t dump(String8& dst, int spaces, int index);

    audio_port_handle_t portId() const { return mPortId; }
    uid_t uid() const { return mUid; }
@@ -67,7 +71,8 @@ public:
        mStream(stream), mFlags(flags) {}
    ~TrackClientDescriptor() override = default;

    status_t    dump(int fd) override;
    using ClientDescriptor::dump;
    status_t dump(String8& dst, int spaces, int index) override;

    audio_output_flags_t flags() const { return mFlags; }
    audio_stream_type_t stream() const { return mStream; }
@@ -88,7 +93,8 @@ public:
        mSource(source), mFlags(flags) {}
    ~RecordClientDescriptor() override = default;

    status_t    dump(int fd) override;
    using ClientDescriptor::dump;
    status_t dump(String8& dst, int spaces, int index) override;

    audio_source_t source() const { return mSource; }
    audio_input_flags_t flags() const { return mFlags; }
@@ -98,4 +104,9 @@ private:
    const audio_input_flags_t mFlags;
};

typedef std::vector< sp<TrackClientDescriptor> > TrackClientVector;
typedef std::map< audio_port_handle_t, sp<TrackClientDescriptor> > TrackClientMap;
typedef std::vector< sp<RecordClientDescriptor> > RecordClientVector;
typedef std::map< audio_port_handle_t, sp<RecordClientDescriptor> > RecordClientMap;

} // namespace android
+32 −0
Original line number Diff line number Diff line
@@ -340,6 +340,18 @@ void AudioInputDescriptor::updateSessionRecordingConfiguration(
                                                     &config, mPatchHandle);
}

RecordClientVector AudioInputDescriptor::getClientsForSession(
    audio_session_t session)
{
    RecordClientVector clients;
    for (const auto &client : mClients) {
        if (client.second->session() == session) {
            clients.push_back(client.second);
        }
    }
    return clients;
}

status_t AudioInputDescriptor::dump(int fd)
{
    const size_t SIZE = 256;
@@ -361,6 +373,13 @@ status_t AudioInputDescriptor::dump(int fd)

    mSessions.dump(fd, 1);

    size_t index = 0;
    result = " AudioRecord clients:\n";
    for (const auto& client: mClients) {
        client.second->dump(result, 2, index++);
    }
    result.append(" \n");
    write(fd, result.string(), result.size());
    return NO_ERROR;
}

@@ -423,6 +442,19 @@ audio_devices_t AudioInputCollection::getSupportedDevices(audio_io_handle_t hand
    return devices;
}

sp<AudioInputDescriptor> AudioInputCollection::getInputForClient(audio_port_handle_t portId)
{
    for (size_t i = 0; i < size(); i++) {
        sp<AudioInputDescriptor> inputDesc = valueAt(i);
        for (const auto& client : inputDesc->clients()) {
            if (client.second->portId() == portId) {
                return inputDesc;
            }
        }
    }
    return 0;
}

status_t AudioInputCollection::dump(int fd) const
{
    const size_t SIZE = 256;
Loading