1599c758b258cc5da0dba9b530425381facc37d77Eric Laurent/*
2599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * Copyright (C) 2015 The Android Open Source Project
3599c758b258cc5da0dba9b530425381facc37d77Eric Laurent *
4599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
5599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * you may not use this file except in compliance with the License.
6599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * You may obtain a copy of the License at
7599c758b258cc5da0dba9b530425381facc37d77Eric Laurent *
8599c758b258cc5da0dba9b530425381facc37d77Eric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
9599c758b258cc5da0dba9b530425381facc37d77Eric Laurent *
10599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * Unless required by applicable law or agreed to in writing, software
11599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
12599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * See the License for the specific language governing permissions and
14599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * limitations under the License.
15599c758b258cc5da0dba9b530425381facc37d77Eric Laurent */
16599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
17599c758b258cc5da0dba9b530425381facc37d77Eric Laurent#pragma once
18599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
19599c758b258cc5da0dba9b530425381facc37d77Eric Laurent#include <system/audio.h>
20599c758b258cc5da0dba9b530425381facc37d77Eric Laurent#include <utils/Errors.h>
21599c758b258cc5da0dba9b530425381facc37d77Eric Laurent#include <utils/RefBase.h>
22599c758b258cc5da0dba9b530425381facc37d77Eric Laurent#include <utils/Errors.h>
23599c758b258cc5da0dba9b530425381facc37d77Eric Laurent#include <utils/KeyedVector.h>
242f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi#include <media/AudioPolicy.h>
25ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Trivi#include <media/IAudioPolicyServiceClient.h>
268c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi#include "AudioSessionInfoProvider.h"
27599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
28599c758b258cc5da0dba9b530425381facc37d77Eric Laurentnamespace android {
29599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
302f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Triviclass AudioPolicyClientInterface;
312f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi
328c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Triviclass AudioSession : public RefBase, public AudioSessionInfoUpdateListener
33599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{
34599c758b258cc5da0dba9b530425381facc37d77Eric Laurentpublic:
35599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    AudioSession(audio_session_t session,
36599c758b258cc5da0dba9b530425381facc37d77Eric Laurent                 audio_source_t inputSource,
37599c758b258cc5da0dba9b530425381facc37d77Eric Laurent                 audio_format_t format,
38599c758b258cc5da0dba9b530425381facc37d77Eric Laurent                 uint32_t sampleRate,
39599c758b258cc5da0dba9b530425381facc37d77Eric Laurent                 audio_channel_mask_t channelMask,
40599c758b258cc5da0dba9b530425381facc37d77Eric Laurent                 audio_input_flags_t flags,
41599c758b258cc5da0dba9b530425381facc37d77Eric Laurent                 uid_t uid,
422f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi                 bool isSoundTrigger,
432f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi                 AudioMix* policyMix,
442f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi                 AudioPolicyClientInterface *clientInterface);
45599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
46599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    status_t dump(int fd, int spaces, int index) const;
47599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
48ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Trivi    audio_session_t session() const { return mRecordClientInfo.session; }
49ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Trivi    audio_source_t inputSource()const { return mRecordClientInfo.source; }
507281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi    audio_format_t format() const { return mConfig.format; }
517281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi    uint32_t sampleRate() const { return mConfig.sample_rate; }
527281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi    audio_channel_mask_t channelMask() const { return mConfig.channel_mask; }
53599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    audio_input_flags_t flags() const { return mFlags; }
54ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Trivi    uid_t uid() const { return mRecordClientInfo.uid; }
55a54f1283fdd9adbd64ecca4e14af56aaa0e8c825Eric Laurent    void setUid(uid_t uid) { mRecordClientInfo.uid = uid; }
56599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    bool matches(const sp<AudioSession> &other) const;
57599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    bool isSoundTrigger() const { return mIsSoundTrigger; }
58599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    uint32_t openCount() const { return mOpenCount; } ;
59599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    uint32_t activeCount() const { return mActiveCount; } ;
60599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
61599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    uint32_t changeOpenCount(int delta);
62599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    uint32_t changeActiveCount(int delta);
63599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
648c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi    void setInfoProvider(AudioSessionInfoProvider *provider);
658c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi    // implementation of AudioSessionInfoUpdateListener
668c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi    virtual void onSessionInfoUpdate() const;
677281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi
68599c758b258cc5da0dba9b530425381facc37d77Eric Laurentprivate:
69a54f1283fdd9adbd64ecca4e14af56aaa0e8c825Eric Laurent    record_client_info_t mRecordClientInfo;
707281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi    const struct audio_config_base mConfig;
71599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    const audio_input_flags_t mFlags;
72599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    bool  mIsSoundTrigger;
73599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    uint32_t  mOpenCount;
74599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    uint32_t  mActiveCount;
752f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi    AudioMix* mPolicyMix; // non NULL when used by a dynamic policy
762f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi    AudioPolicyClientInterface* mClientInterface;
778c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi    const AudioSessionInfoProvider* mInfoProvider;
78599c758b258cc5da0dba9b530425381facc37d77Eric Laurent};
79599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
80599c758b258cc5da0dba9b530425381facc37d77Eric Laurentclass AudioSessionCollection :
818c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi    public DefaultKeyedVector<audio_session_t, sp<AudioSession> >,
828c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi    public AudioSessionInfoUpdateListener
83599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{
84599c758b258cc5da0dba9b530425381facc37d77Eric Laurentpublic:
85599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    status_t addSession(audio_session_t session,
868c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi                             const sp<AudioSession>& audioSession,
878c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi                             AudioSessionInfoProvider *provider);
88599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
89599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    status_t removeSession(audio_session_t session);
90599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
91599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    uint32_t getOpenCount() const;
92599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
93599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    AudioSessionCollection getActiveSessions() const;
9456afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi    size_t getActiveSessionCount() const;
95599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    bool hasActiveSession() const;
96599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    bool isSourceActive(audio_source_t source) const;
97fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent    audio_source_t getHighestPrioritySource(bool activeOnly) const;
98599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
998c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi    // implementation of AudioSessionInfoUpdateListener
1008c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi    virtual void onSessionInfoUpdate() const;
1018c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi
102599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    status_t dump(int fd, int spaces) const;
103599c758b258cc5da0dba9b530425381facc37d77Eric Laurent};
104599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
105599c758b258cc5da0dba9b530425381facc37d77Eric Laurent}; // namespace android
106