1df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi/*
2df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi * Copyright (C) 2014 The Android Open Source Project
3df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi *
4df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
5df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi * you may not use this file except in compliance with the License.
6df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi * You may obtain a copy of the License at
7df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi *
8df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
9df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi *
10df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
11df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
12df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi * See the License for the specific language governing permissions and
14df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi * limitations under the License.
15df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi */
16df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi#ifndef AUDIO_POLICY_HELPER_H_
17df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi#define AUDIO_POLICY_HELPER_H_
18df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi
19df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi#include <system/audio.h>
20df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi
21e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurentstatic audio_stream_type_t audio_attributes_to_stream_type(const audio_attributes_t *attr)
22df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi{
23df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    // flags to stream type mapping
24df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    if ((attr->flags & AUDIO_FLAG_AUDIBILITY_ENFORCED) == AUDIO_FLAG_AUDIBILITY_ENFORCED) {
25df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi        return AUDIO_STREAM_ENFORCED_AUDIBLE;
26df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    }
27df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    if ((attr->flags & AUDIO_FLAG_SCO) == AUDIO_FLAG_SCO) {
28df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi        return AUDIO_STREAM_BLUETOOTH_SCO;
29df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    }
30df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi
31df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    // usage to stream type mapping
32df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    switch (attr->usage) {
33df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    case AUDIO_USAGE_MEDIA:
34df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    case AUDIO_USAGE_GAME:
35df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY:
36df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    case AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
37df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi        return AUDIO_STREAM_MUSIC;
38df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    case AUDIO_USAGE_ASSISTANCE_SONIFICATION:
39df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi        return AUDIO_STREAM_SYSTEM;
40df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    case AUDIO_USAGE_VOICE_COMMUNICATION:
41df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi        return AUDIO_STREAM_VOICE_CALL;
42df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi
43df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    case AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING:
44df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi        return AUDIO_STREAM_DTMF;
45df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi
46df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    case AUDIO_USAGE_ALARM:
47df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi        return AUDIO_STREAM_ALARM;
48df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    case AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
49df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi        return AUDIO_STREAM_RING;
50df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi
51df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    case AUDIO_USAGE_NOTIFICATION:
52df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
53df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
54df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
55df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    case AUDIO_USAGE_NOTIFICATION_EVENT:
56df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi        return AUDIO_STREAM_NOTIFICATION;
57df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi
58df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    case AUDIO_USAGE_UNKNOWN:
59df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    default:
60df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi        return AUDIO_STREAM_MUSIC;
61df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi    }
62df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi}
63df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi
64e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurentstatic void stream_type_to_audio_attributes(audio_stream_type_t streamType,
65e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                     audio_attributes_t *attr) {
66275e8e9de2e11b4b344f5a201f1f0e51fda02d9cEric Laurent    memset(attr, 0, sizeof(audio_attributes_t));
67e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent
68e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    switch (streamType) {
69e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    case AUDIO_STREAM_DEFAULT:
70e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    case AUDIO_STREAM_MUSIC:
71e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        attr->content_type = AUDIO_CONTENT_TYPE_MUSIC;
72e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        attr->usage = AUDIO_USAGE_MEDIA;
73e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        break;
74e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    case AUDIO_STREAM_VOICE_CALL:
75e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        attr->content_type = AUDIO_CONTENT_TYPE_SPEECH;
76e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        attr->usage = AUDIO_USAGE_VOICE_COMMUNICATION;
77e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        break;
78e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    case AUDIO_STREAM_ENFORCED_AUDIBLE:
79e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        attr->flags  |= AUDIO_FLAG_AUDIBILITY_ENFORCED;
80e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        // intended fall through, attributes in common with STREAM_SYSTEM
81e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    case AUDIO_STREAM_SYSTEM:
82e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        attr->content_type = AUDIO_CONTENT_TYPE_SONIFICATION;
83e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        attr->usage = AUDIO_USAGE_ASSISTANCE_SONIFICATION;
84e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        break;
85e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    case AUDIO_STREAM_RING:
86e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        attr->content_type = AUDIO_CONTENT_TYPE_SONIFICATION;
87e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        attr->usage = AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE;
88e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        break;
89e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    case AUDIO_STREAM_ALARM:
90e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        attr->content_type = AUDIO_CONTENT_TYPE_SONIFICATION;
91e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        attr->usage = AUDIO_USAGE_ALARM;
92e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        break;
93e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    case AUDIO_STREAM_NOTIFICATION:
94e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        attr->content_type = AUDIO_CONTENT_TYPE_SONIFICATION;
95e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        attr->usage = AUDIO_USAGE_NOTIFICATION;
96e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        break;
97e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    case AUDIO_STREAM_BLUETOOTH_SCO:
98e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        attr->content_type = AUDIO_CONTENT_TYPE_SPEECH;
99e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        attr->usage = AUDIO_USAGE_VOICE_COMMUNICATION;
100e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        attr->flags |= AUDIO_FLAG_SCO;
101e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        break;
102e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    case AUDIO_STREAM_DTMF:
103e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        attr->content_type = AUDIO_CONTENT_TYPE_SONIFICATION;
104e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        attr->usage = AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING;
105e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        break;
106e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    case AUDIO_STREAM_TTS:
107e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        attr->content_type = AUDIO_CONTENT_TYPE_SPEECH;
108e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        attr->usage = AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY;
109e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        break;
110e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    default:
111e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        ALOGE("invalid stream type %d when converting to attributes", streamType);
112e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    }
113e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent}
114e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent
115df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi#endif //AUDIO_POLICY_HELPER_H_
116