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>
258c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi#include "AudioSessionInfoProvider.h"
26599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
27599c758b258cc5da0dba9b530425381facc37d77Eric Laurentnamespace android {
28599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
292f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Triviclass AudioPolicyClientInterface;
302f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi
318c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Triviclass AudioSession : public RefBase, public AudioSessionInfoUpdateListener
32599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{
33599c758b258cc5da0dba9b530425381facc37d77Eric Laurentpublic:
34599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    AudioSession(audio_session_t session,
35599c758b258cc5da0dba9b530425381facc37d77Eric Laurent                 audio_source_t inputSource,
36599c758b258cc5da0dba9b530425381facc37d77Eric Laurent                 audio_format_t format,
37599c758b258cc5da0dba9b530425381facc37d77Eric Laurent                 uint32_t sampleRate,
38599c758b258cc5da0dba9b530425381facc37d77Eric Laurent                 audio_channel_mask_t channelMask,
39599c758b258cc5da0dba9b530425381facc37d77Eric Laurent                 audio_input_flags_t flags,
40599c758b258cc5da0dba9b530425381facc37d77Eric Laurent                 uid_t uid,
412f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi                 bool isSoundTrigger,
422f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi                 AudioMix* policyMix,
432f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi                 AudioPolicyClientInterface *clientInterface);
44599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
45599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    status_t dump(int fd, int spaces, int index) const;
46599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
47599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    audio_session_t session() const { return mSession; }
48599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    audio_source_t inputSource()const { return mInputSource; }
497281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi    audio_format_t format() const { return mConfig.format; }
507281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi    uint32_t sampleRate() const { return mConfig.sample_rate; }
517281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi    audio_channel_mask_t channelMask() const { return mConfig.channel_mask; }
52599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    audio_input_flags_t flags() const { return mFlags; }
53599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    uid_t uid() const { return mUid; }
54599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    bool matches(const sp<AudioSession> &other) const;
55599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    bool isSoundTrigger() const { return mIsSoundTrigger; }
56599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    uint32_t openCount() const { return mOpenCount; } ;
57599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    uint32_t activeCount() const { return mActiveCount; } ;
58599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
59599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    uint32_t changeOpenCount(int delta);
60599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    uint32_t changeActiveCount(int delta);
61599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
628c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi    void setInfoProvider(AudioSessionInfoProvider *provider);
638c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi    // implementation of AudioSessionInfoUpdateListener
648c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi    virtual void onSessionInfoUpdate() const;
657281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi
66599c758b258cc5da0dba9b530425381facc37d77Eric Laurentprivate:
67599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    const audio_session_t mSession;
68599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    const audio_source_t mInputSource;
697281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi    const struct audio_config_base mConfig;
70599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    const audio_input_flags_t mFlags;
71599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    const uid_t mUid;
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;
94599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    bool hasActiveSession() const;
95599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    bool isSourceActive(audio_source_t source) const;
96599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
978c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi    // implementation of AudioSessionInfoUpdateListener
988c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi    virtual void onSessionInfoUpdate() const;
998c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi
100599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    status_t dump(int fd, int spaces) const;
101599c758b258cc5da0dba9b530425381facc37d77Eric Laurent};
102599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
103599c758b258cc5da0dba9b530425381facc37d77Eric Laurent}; // namespace android
104