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