1*bebae9c0SAndroid Build Coastguard Worker /*
2*bebae9c0SAndroid Build Coastguard Worker * Copyright (C) 2010 The Android Open Source Project
3*bebae9c0SAndroid Build Coastguard Worker *
4*bebae9c0SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*bebae9c0SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*bebae9c0SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*bebae9c0SAndroid Build Coastguard Worker *
8*bebae9c0SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*bebae9c0SAndroid Build Coastguard Worker *
10*bebae9c0SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*bebae9c0SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*bebae9c0SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*bebae9c0SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*bebae9c0SAndroid Build Coastguard Worker * limitations under the License.
15*bebae9c0SAndroid Build Coastguard Worker */
16*bebae9c0SAndroid Build Coastguard Worker
17*bebae9c0SAndroid Build Coastguard Worker // Demonstrate environmental reverb and preset reverb on an output mix and audio player
18*bebae9c0SAndroid Build Coastguard Worker
19*bebae9c0SAndroid Build Coastguard Worker #include <SLES/OpenSLES.h>
20*bebae9c0SAndroid Build Coastguard Worker #include <assert.h>
21*bebae9c0SAndroid Build Coastguard Worker #include <pthread.h>
22*bebae9c0SAndroid Build Coastguard Worker #include <string.h>
23*bebae9c0SAndroid Build Coastguard Worker #include <stdio.h>
24*bebae9c0SAndroid Build Coastguard Worker #include <stdlib.h>
25*bebae9c0SAndroid Build Coastguard Worker #include <unistd.h>
26*bebae9c0SAndroid Build Coastguard Worker
27*bebae9c0SAndroid Build Coastguard Worker #define bool int
28*bebae9c0SAndroid Build Coastguard Worker #define false 0
29*bebae9c0SAndroid Build Coastguard Worker #define true 1
30*bebae9c0SAndroid Build Coastguard Worker
31*bebae9c0SAndroid Build Coastguard Worker // Table of I3DL2 named environmental reverb settings
32*bebae9c0SAndroid Build Coastguard Worker
33*bebae9c0SAndroid Build Coastguard Worker typedef struct {
34*bebae9c0SAndroid Build Coastguard Worker const char *mName;
35*bebae9c0SAndroid Build Coastguard Worker SLEnvironmentalReverbSettings mSettings;
36*bebae9c0SAndroid Build Coastguard Worker } Pair;
37*bebae9c0SAndroid Build Coastguard Worker
38*bebae9c0SAndroid Build Coastguard Worker #define _(name) {#name, SL_I3DL2_ENVIRONMENT_PRESET_##name},
39*bebae9c0SAndroid Build Coastguard Worker
40*bebae9c0SAndroid Build Coastguard Worker Pair pairs[] = {
41*bebae9c0SAndroid Build Coastguard Worker _(DEFAULT)
42*bebae9c0SAndroid Build Coastguard Worker _(GENERIC)
43*bebae9c0SAndroid Build Coastguard Worker _(PADDEDCELL)
44*bebae9c0SAndroid Build Coastguard Worker _(ROOM)
45*bebae9c0SAndroid Build Coastguard Worker _(BATHROOM)
46*bebae9c0SAndroid Build Coastguard Worker _(LIVINGROOM)
47*bebae9c0SAndroid Build Coastguard Worker _(STONEROOM)
48*bebae9c0SAndroid Build Coastguard Worker _(AUDITORIUM)
49*bebae9c0SAndroid Build Coastguard Worker _(CONCERTHALL)
50*bebae9c0SAndroid Build Coastguard Worker _(CAVE)
51*bebae9c0SAndroid Build Coastguard Worker _(ARENA)
52*bebae9c0SAndroid Build Coastguard Worker _(HANGAR)
53*bebae9c0SAndroid Build Coastguard Worker _(CARPETEDHALLWAY)
54*bebae9c0SAndroid Build Coastguard Worker _(HALLWAY)
55*bebae9c0SAndroid Build Coastguard Worker _(STONECORRIDOR)
56*bebae9c0SAndroid Build Coastguard Worker _(ALLEY)
57*bebae9c0SAndroid Build Coastguard Worker _(FOREST)
58*bebae9c0SAndroid Build Coastguard Worker _(CITY)
59*bebae9c0SAndroid Build Coastguard Worker _(MOUNTAINS)
60*bebae9c0SAndroid Build Coastguard Worker _(QUARRY)
61*bebae9c0SAndroid Build Coastguard Worker _(PLAIN)
62*bebae9c0SAndroid Build Coastguard Worker _(PARKINGLOT)
63*bebae9c0SAndroid Build Coastguard Worker _(SEWERPIPE)
64*bebae9c0SAndroid Build Coastguard Worker _(UNDERWATER)
65*bebae9c0SAndroid Build Coastguard Worker _(SMALLROOM)
66*bebae9c0SAndroid Build Coastguard Worker _(MEDIUMROOM)
67*bebae9c0SAndroid Build Coastguard Worker _(LARGEROOM)
68*bebae9c0SAndroid Build Coastguard Worker _(MEDIUMHALL)
69*bebae9c0SAndroid Build Coastguard Worker _(LARGEHALL)
70*bebae9c0SAndroid Build Coastguard Worker _(PLATE)
71*bebae9c0SAndroid Build Coastguard Worker };
72*bebae9c0SAndroid Build Coastguard Worker
73*bebae9c0SAndroid Build Coastguard Worker // Parameters for preset reverb on output mix
74*bebae9c0SAndroid Build Coastguard Worker bool outputMixPresetItfRequested = false;
75*bebae9c0SAndroid Build Coastguard Worker SLuint16 outputMixPresetNumber = ~0;
76*bebae9c0SAndroid Build Coastguard Worker
77*bebae9c0SAndroid Build Coastguard Worker // Parameters for environmental reverb on output mix
78*bebae9c0SAndroid Build Coastguard Worker bool outputMixEnvironmentalItfRequested = false;
79*bebae9c0SAndroid Build Coastguard Worker char *outputMixEnvironmentalName = NULL;
80*bebae9c0SAndroid Build Coastguard Worker SLEnvironmentalReverbSettings outputMixEnvironmentalSettings;
81*bebae9c0SAndroid Build Coastguard Worker
82*bebae9c0SAndroid Build Coastguard Worker // Parameters for preset reverb on audio player (not supported)
83*bebae9c0SAndroid Build Coastguard Worker bool playerPresetItfRequested = false;
84*bebae9c0SAndroid Build Coastguard Worker SLuint16 playerPresetNumber = ~0;
85*bebae9c0SAndroid Build Coastguard Worker
86*bebae9c0SAndroid Build Coastguard Worker // Parameters for environmental reverb on audio player (not supported)
87*bebae9c0SAndroid Build Coastguard Worker bool playerEnvironmentalItfRequested = false;
88*bebae9c0SAndroid Build Coastguard Worker char *playerEnvironmentalName = NULL;
89*bebae9c0SAndroid Build Coastguard Worker SLEnvironmentalReverbSettings playerEnvironmentalSettings;
90*bebae9c0SAndroid Build Coastguard Worker
91*bebae9c0SAndroid Build Coastguard Worker // Compare two environmental reverb settings structures.
92*bebae9c0SAndroid Build Coastguard Worker // Returns true if the settings are identical, or false if they are different.
93*bebae9c0SAndroid Build Coastguard Worker
slesutCompareEnvironmentalReverbSettings(const SLEnvironmentalReverbSettings * settings1,const SLEnvironmentalReverbSettings * settings2)94*bebae9c0SAndroid Build Coastguard Worker bool slesutCompareEnvironmentalReverbSettings(
95*bebae9c0SAndroid Build Coastguard Worker const SLEnvironmentalReverbSettings *settings1,
96*bebae9c0SAndroid Build Coastguard Worker const SLEnvironmentalReverbSettings *settings2)
97*bebae9c0SAndroid Build Coastguard Worker {
98*bebae9c0SAndroid Build Coastguard Worker return
99*bebae9c0SAndroid Build Coastguard Worker (settings1->roomLevel == settings2->roomLevel) &&
100*bebae9c0SAndroid Build Coastguard Worker (settings1->roomHFLevel == settings2->roomHFLevel) &&
101*bebae9c0SAndroid Build Coastguard Worker (settings1->decayTime == settings2->decayTime) &&
102*bebae9c0SAndroid Build Coastguard Worker (settings1->decayHFRatio == settings2->decayHFRatio) &&
103*bebae9c0SAndroid Build Coastguard Worker (settings1->reflectionsLevel == settings2->reflectionsLevel) &&
104*bebae9c0SAndroid Build Coastguard Worker (settings1->reflectionsDelay == settings2->reflectionsDelay) &&
105*bebae9c0SAndroid Build Coastguard Worker (settings1->reverbLevel == settings2->reverbLevel) &&
106*bebae9c0SAndroid Build Coastguard Worker (settings1->reverbDelay == settings2->reverbDelay) &&
107*bebae9c0SAndroid Build Coastguard Worker (settings1->diffusion == settings2->diffusion) &&
108*bebae9c0SAndroid Build Coastguard Worker (settings1->density == settings2->density);
109*bebae9c0SAndroid Build Coastguard Worker }
110*bebae9c0SAndroid Build Coastguard Worker
111*bebae9c0SAndroid Build Coastguard Worker // Print an environmental reverb settings structure.
112*bebae9c0SAndroid Build Coastguard Worker
slesutPrintEnvironmentalReverbSettings(const SLEnvironmentalReverbSettings * settings)113*bebae9c0SAndroid Build Coastguard Worker void slesutPrintEnvironmentalReverbSettings(const SLEnvironmentalReverbSettings *settings)
114*bebae9c0SAndroid Build Coastguard Worker {
115*bebae9c0SAndroid Build Coastguard Worker printf("roomLevel: %d\n", settings->roomLevel);
116*bebae9c0SAndroid Build Coastguard Worker printf("roomHFLevel: %d\n", settings->roomHFLevel);
117*bebae9c0SAndroid Build Coastguard Worker printf("decayTime: %d\n", settings->decayTime);
118*bebae9c0SAndroid Build Coastguard Worker printf("decayHFRatio: %d\n", settings->decayHFRatio);
119*bebae9c0SAndroid Build Coastguard Worker printf("reflectionsLevel: %d\n", settings->reflectionsLevel);
120*bebae9c0SAndroid Build Coastguard Worker printf("reflectionsDelay: %d\n", settings->reflectionsDelay);
121*bebae9c0SAndroid Build Coastguard Worker printf("reverbLevel: %d\n", settings->reverbLevel);
122*bebae9c0SAndroid Build Coastguard Worker printf("reverbDelay: %d\n", settings->reverbDelay);
123*bebae9c0SAndroid Build Coastguard Worker printf("diffusion: %d\n", settings->diffusion);
124*bebae9c0SAndroid Build Coastguard Worker printf("density: %d\n", settings->density);
125*bebae9c0SAndroid Build Coastguard Worker }
126*bebae9c0SAndroid Build Coastguard Worker
127*bebae9c0SAndroid Build Coastguard Worker // Lookup environmental reverb settings by name
128*bebae9c0SAndroid Build Coastguard Worker
lookupEnvName(const char * name)129*bebae9c0SAndroid Build Coastguard Worker const SLEnvironmentalReverbSettings *lookupEnvName(const char *name)
130*bebae9c0SAndroid Build Coastguard Worker {
131*bebae9c0SAndroid Build Coastguard Worker unsigned j;
132*bebae9c0SAndroid Build Coastguard Worker for (j = 0; j < sizeof(pairs) / sizeof(pairs[0]); ++j) {
133*bebae9c0SAndroid Build Coastguard Worker if (!strcasecmp(name, pairs[j].mName)) {
134*bebae9c0SAndroid Build Coastguard Worker return &pairs[j].mSettings;
135*bebae9c0SAndroid Build Coastguard Worker }
136*bebae9c0SAndroid Build Coastguard Worker }
137*bebae9c0SAndroid Build Coastguard Worker return NULL;
138*bebae9c0SAndroid Build Coastguard Worker }
139*bebae9c0SAndroid Build Coastguard Worker
140*bebae9c0SAndroid Build Coastguard Worker // Print all available environmental reverb names
141*bebae9c0SAndroid Build Coastguard Worker
printEnvNames(void)142*bebae9c0SAndroid Build Coastguard Worker void printEnvNames(void)
143*bebae9c0SAndroid Build Coastguard Worker {
144*bebae9c0SAndroid Build Coastguard Worker unsigned j;
145*bebae9c0SAndroid Build Coastguard Worker bool needSpace = false;
146*bebae9c0SAndroid Build Coastguard Worker bool needNewline = false;
147*bebae9c0SAndroid Build Coastguard Worker unsigned lineLen = 0;
148*bebae9c0SAndroid Build Coastguard Worker for (j = 0; j < sizeof(pairs) / sizeof(pairs[0]); ++j) {
149*bebae9c0SAndroid Build Coastguard Worker const char *name = pairs[j].mName;
150*bebae9c0SAndroid Build Coastguard Worker unsigned nameLen = strlen(name);
151*bebae9c0SAndroid Build Coastguard Worker if (lineLen + (needSpace ? 1 : 0) + nameLen > 72) {
152*bebae9c0SAndroid Build Coastguard Worker putchar('\n');
153*bebae9c0SAndroid Build Coastguard Worker needSpace = false;
154*bebae9c0SAndroid Build Coastguard Worker needNewline = false;
155*bebae9c0SAndroid Build Coastguard Worker lineLen = 0;
156*bebae9c0SAndroid Build Coastguard Worker }
157*bebae9c0SAndroid Build Coastguard Worker if (needSpace) {
158*bebae9c0SAndroid Build Coastguard Worker putchar(' ');
159*bebae9c0SAndroid Build Coastguard Worker ++lineLen;
160*bebae9c0SAndroid Build Coastguard Worker }
161*bebae9c0SAndroid Build Coastguard Worker fputs(name, stdout);
162*bebae9c0SAndroid Build Coastguard Worker lineLen += nameLen;
163*bebae9c0SAndroid Build Coastguard Worker needSpace = true;
164*bebae9c0SAndroid Build Coastguard Worker needNewline = true;
165*bebae9c0SAndroid Build Coastguard Worker }
166*bebae9c0SAndroid Build Coastguard Worker if (needNewline) {
167*bebae9c0SAndroid Build Coastguard Worker putchar('\n');
168*bebae9c0SAndroid Build Coastguard Worker }
169*bebae9c0SAndroid Build Coastguard Worker }
170*bebae9c0SAndroid Build Coastguard Worker
171*bebae9c0SAndroid Build Coastguard Worker // These are extensions to OpenSL ES 1.0.1 values
172*bebae9c0SAndroid Build Coastguard Worker
173*bebae9c0SAndroid Build Coastguard Worker #define SL_PREFETCHSTATUS_UNKNOWN ((SLuint32) 0)
174*bebae9c0SAndroid Build Coastguard Worker #define SL_PREFETCHSTATUS_ERROR ((SLuint32) -1)
175*bebae9c0SAndroid Build Coastguard Worker
176*bebae9c0SAndroid Build Coastguard Worker // Mutex and condition shared with main program to protect prefetch_status
177*bebae9c0SAndroid Build Coastguard Worker
178*bebae9c0SAndroid Build Coastguard Worker static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
179*bebae9c0SAndroid Build Coastguard Worker static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
180*bebae9c0SAndroid Build Coastguard Worker SLuint32 prefetch_status = SL_PREFETCHSTATUS_UNKNOWN;
181*bebae9c0SAndroid Build Coastguard Worker
182*bebae9c0SAndroid Build Coastguard Worker /* used to detect errors likely to have occured when the OpenSL ES framework fails to open
183*bebae9c0SAndroid Build Coastguard Worker * a resource, for instance because a file URI is invalid, or an HTTP server doesn't respond.
184*bebae9c0SAndroid Build Coastguard Worker */
185*bebae9c0SAndroid Build Coastguard Worker #define PREFETCHEVENT_ERROR_CANDIDATE \
186*bebae9c0SAndroid Build Coastguard Worker (SL_PREFETCHEVENT_STATUSCHANGE | SL_PREFETCHEVENT_FILLLEVELCHANGE)
187*bebae9c0SAndroid Build Coastguard Worker
188*bebae9c0SAndroid Build Coastguard Worker // Prefetch status callback
189*bebae9c0SAndroid Build Coastguard Worker
prefetch_callback(SLPrefetchStatusItf caller,void * context,SLuint32 event)190*bebae9c0SAndroid Build Coastguard Worker void prefetch_callback(SLPrefetchStatusItf caller, void *context, SLuint32 event)
191*bebae9c0SAndroid Build Coastguard Worker {
192*bebae9c0SAndroid Build Coastguard Worker SLresult result;
193*bebae9c0SAndroid Build Coastguard Worker assert(context == NULL);
194*bebae9c0SAndroid Build Coastguard Worker SLpermille level;
195*bebae9c0SAndroid Build Coastguard Worker result = (*caller)->GetFillLevel(caller, &level);
196*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
197*bebae9c0SAndroid Build Coastguard Worker SLuint32 status;
198*bebae9c0SAndroid Build Coastguard Worker result = (*caller)->GetPrefetchStatus(caller, &status);
199*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
200*bebae9c0SAndroid Build Coastguard Worker SLuint32 new_prefetch_status;
201*bebae9c0SAndroid Build Coastguard Worker if ((event & PREFETCHEVENT_ERROR_CANDIDATE) == PREFETCHEVENT_ERROR_CANDIDATE
202*bebae9c0SAndroid Build Coastguard Worker && level == 0 && status == SL_PREFETCHSTATUS_UNDERFLOW) {
203*bebae9c0SAndroid Build Coastguard Worker new_prefetch_status = SL_PREFETCHSTATUS_ERROR;
204*bebae9c0SAndroid Build Coastguard Worker } else if (event == SL_PREFETCHEVENT_STATUSCHANGE &&
205*bebae9c0SAndroid Build Coastguard Worker status == SL_PREFETCHSTATUS_SUFFICIENTDATA) {
206*bebae9c0SAndroid Build Coastguard Worker new_prefetch_status = status;
207*bebae9c0SAndroid Build Coastguard Worker } else {
208*bebae9c0SAndroid Build Coastguard Worker return;
209*bebae9c0SAndroid Build Coastguard Worker }
210*bebae9c0SAndroid Build Coastguard Worker int ok;
211*bebae9c0SAndroid Build Coastguard Worker ok = pthread_mutex_lock(&mutex);
212*bebae9c0SAndroid Build Coastguard Worker assert(ok == 0);
213*bebae9c0SAndroid Build Coastguard Worker prefetch_status = new_prefetch_status;
214*bebae9c0SAndroid Build Coastguard Worker ok = pthread_cond_signal(&cond);
215*bebae9c0SAndroid Build Coastguard Worker assert(ok == 0);
216*bebae9c0SAndroid Build Coastguard Worker ok = pthread_mutex_unlock(&mutex);
217*bebae9c0SAndroid Build Coastguard Worker assert(ok == 0);
218*bebae9c0SAndroid Build Coastguard Worker }
219*bebae9c0SAndroid Build Coastguard Worker
220*bebae9c0SAndroid Build Coastguard Worker // Main program
221*bebae9c0SAndroid Build Coastguard Worker
main(int argc,char ** argv)222*bebae9c0SAndroid Build Coastguard Worker int main(int argc, char **argv)
223*bebae9c0SAndroid Build Coastguard Worker {
224*bebae9c0SAndroid Build Coastguard Worker SLresult result;
225*bebae9c0SAndroid Build Coastguard Worker bool loop = false;
226*bebae9c0SAndroid Build Coastguard Worker
227*bebae9c0SAndroid Build Coastguard Worker // process command line parameters
228*bebae9c0SAndroid Build Coastguard Worker char *prog = argv[0];
229*bebae9c0SAndroid Build Coastguard Worker int i;
230*bebae9c0SAndroid Build Coastguard Worker for (i = 1; i < argc; ++i) {
231*bebae9c0SAndroid Build Coastguard Worker char *arg = argv[i];
232*bebae9c0SAndroid Build Coastguard Worker if (arg[0] != '-')
233*bebae9c0SAndroid Build Coastguard Worker break;
234*bebae9c0SAndroid Build Coastguard Worker bool bad = false; // whether the option string is invalid
235*bebae9c0SAndroid Build Coastguard Worker if (!strncmp(arg, "--mix-preset", 12)) {
236*bebae9c0SAndroid Build Coastguard Worker if ('\0' == arg[12]) {
237*bebae9c0SAndroid Build Coastguard Worker outputMixPresetItfRequested = true;
238*bebae9c0SAndroid Build Coastguard Worker } else if ('=' == arg[12]) {
239*bebae9c0SAndroid Build Coastguard Worker outputMixPresetNumber = atoi(&arg[13]);
240*bebae9c0SAndroid Build Coastguard Worker outputMixPresetItfRequested = true;
241*bebae9c0SAndroid Build Coastguard Worker } else {
242*bebae9c0SAndroid Build Coastguard Worker bad = true;
243*bebae9c0SAndroid Build Coastguard Worker }
244*bebae9c0SAndroid Build Coastguard Worker } else if (!strncmp(arg, "--mix-name", 10)) {
245*bebae9c0SAndroid Build Coastguard Worker if ('\0' == arg[10]) {
246*bebae9c0SAndroid Build Coastguard Worker outputMixEnvironmentalItfRequested = true;
247*bebae9c0SAndroid Build Coastguard Worker } else if ('=' == arg[10]) {
248*bebae9c0SAndroid Build Coastguard Worker outputMixEnvironmentalName = &arg[11];
249*bebae9c0SAndroid Build Coastguard Worker outputMixEnvironmentalItfRequested = true;
250*bebae9c0SAndroid Build Coastguard Worker } else {
251*bebae9c0SAndroid Build Coastguard Worker bad = true;
252*bebae9c0SAndroid Build Coastguard Worker }
253*bebae9c0SAndroid Build Coastguard Worker } else if (!strncmp(arg, "--player-preset", 15)) {
254*bebae9c0SAndroid Build Coastguard Worker if ('\0' == arg[15]) {
255*bebae9c0SAndroid Build Coastguard Worker playerPresetItfRequested = true;
256*bebae9c0SAndroid Build Coastguard Worker } else if ('=' == arg[15]) {
257*bebae9c0SAndroid Build Coastguard Worker playerPresetNumber = atoi(&arg[16]);
258*bebae9c0SAndroid Build Coastguard Worker playerPresetItfRequested = true;
259*bebae9c0SAndroid Build Coastguard Worker } else {
260*bebae9c0SAndroid Build Coastguard Worker bad = true;
261*bebae9c0SAndroid Build Coastguard Worker }
262*bebae9c0SAndroid Build Coastguard Worker } else if (!strncmp(arg, "--player-name", 13)) {
263*bebae9c0SAndroid Build Coastguard Worker if ('\0' == arg[13]) {
264*bebae9c0SAndroid Build Coastguard Worker playerEnvironmentalItfRequested = true;
265*bebae9c0SAndroid Build Coastguard Worker } else if ('=' == arg[13]) {
266*bebae9c0SAndroid Build Coastguard Worker playerEnvironmentalName = &arg[14];
267*bebae9c0SAndroid Build Coastguard Worker playerEnvironmentalItfRequested = true;
268*bebae9c0SAndroid Build Coastguard Worker } else {
269*bebae9c0SAndroid Build Coastguard Worker bad = true;
270*bebae9c0SAndroid Build Coastguard Worker }
271*bebae9c0SAndroid Build Coastguard Worker } else if (!strcmp(arg, "--loop")) {
272*bebae9c0SAndroid Build Coastguard Worker loop = true;
273*bebae9c0SAndroid Build Coastguard Worker } else {
274*bebae9c0SAndroid Build Coastguard Worker bad = true;
275*bebae9c0SAndroid Build Coastguard Worker }
276*bebae9c0SAndroid Build Coastguard Worker if (bad) {
277*bebae9c0SAndroid Build Coastguard Worker fprintf(stderr, "%s: unknown option %s ignored\n", prog, arg);
278*bebae9c0SAndroid Build Coastguard Worker }
279*bebae9c0SAndroid Build Coastguard Worker }
280*bebae9c0SAndroid Build Coastguard Worker if (argc - i != 1) {
281*bebae9c0SAndroid Build Coastguard Worker fprintf(stderr, "usage: %s --mix-preset=# --mix-name=I3DL2 --player-preset=# "
282*bebae9c0SAndroid Build Coastguard Worker "--player-name=I3DL2 --loop filename\n", prog);
283*bebae9c0SAndroid Build Coastguard Worker return EXIT_FAILURE;
284*bebae9c0SAndroid Build Coastguard Worker }
285*bebae9c0SAndroid Build Coastguard Worker char *pathname = argv[i];
286*bebae9c0SAndroid Build Coastguard Worker
287*bebae9c0SAndroid Build Coastguard Worker const SLEnvironmentalReverbSettings *envSettings;
288*bebae9c0SAndroid Build Coastguard Worker if (NULL != outputMixEnvironmentalName) {
289*bebae9c0SAndroid Build Coastguard Worker envSettings = lookupEnvName(outputMixEnvironmentalName);
290*bebae9c0SAndroid Build Coastguard Worker if (NULL == envSettings) {
291*bebae9c0SAndroid Build Coastguard Worker fprintf(stderr, "%s: output mix environmental reverb name %s not found, "
292*bebae9c0SAndroid Build Coastguard Worker "available names are:\n", prog, outputMixEnvironmentalName);
293*bebae9c0SAndroid Build Coastguard Worker printEnvNames();
294*bebae9c0SAndroid Build Coastguard Worker return EXIT_FAILURE;
295*bebae9c0SAndroid Build Coastguard Worker }
296*bebae9c0SAndroid Build Coastguard Worker outputMixEnvironmentalSettings = *envSettings;
297*bebae9c0SAndroid Build Coastguard Worker }
298*bebae9c0SAndroid Build Coastguard Worker if (NULL != playerEnvironmentalName) {
299*bebae9c0SAndroid Build Coastguard Worker envSettings = lookupEnvName(playerEnvironmentalName);
300*bebae9c0SAndroid Build Coastguard Worker if (NULL == envSettings) {
301*bebae9c0SAndroid Build Coastguard Worker fprintf(stderr, "%s: player environmental reverb name %s not found, "
302*bebae9c0SAndroid Build Coastguard Worker "available names are:\n", prog, playerEnvironmentalName);
303*bebae9c0SAndroid Build Coastguard Worker printEnvNames();
304*bebae9c0SAndroid Build Coastguard Worker return EXIT_FAILURE;
305*bebae9c0SAndroid Build Coastguard Worker }
306*bebae9c0SAndroid Build Coastguard Worker playerEnvironmentalSettings = *envSettings;
307*bebae9c0SAndroid Build Coastguard Worker }
308*bebae9c0SAndroid Build Coastguard Worker
309*bebae9c0SAndroid Build Coastguard Worker // create engine
310*bebae9c0SAndroid Build Coastguard Worker SLObjectItf engineObject;
311*bebae9c0SAndroid Build Coastguard Worker result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);
312*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
313*bebae9c0SAndroid Build Coastguard Worker result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);
314*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
315*bebae9c0SAndroid Build Coastguard Worker SLEngineItf engineEngine;
316*bebae9c0SAndroid Build Coastguard Worker result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);
317*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
318*bebae9c0SAndroid Build Coastguard Worker
319*bebae9c0SAndroid Build Coastguard Worker // create output mix
320*bebae9c0SAndroid Build Coastguard Worker SLInterfaceID mix_ids[2];
321*bebae9c0SAndroid Build Coastguard Worker SLboolean mix_req[2];
322*bebae9c0SAndroid Build Coastguard Worker SLuint32 count = 0;
323*bebae9c0SAndroid Build Coastguard Worker if (outputMixPresetItfRequested) {
324*bebae9c0SAndroid Build Coastguard Worker mix_req[count] = SL_BOOLEAN_TRUE;
325*bebae9c0SAndroid Build Coastguard Worker mix_ids[count++] = SL_IID_PRESETREVERB;
326*bebae9c0SAndroid Build Coastguard Worker }
327*bebae9c0SAndroid Build Coastguard Worker if (outputMixEnvironmentalItfRequested) {
328*bebae9c0SAndroid Build Coastguard Worker mix_req[count] = SL_BOOLEAN_TRUE;
329*bebae9c0SAndroid Build Coastguard Worker mix_ids[count++] = SL_IID_ENVIRONMENTALREVERB;
330*bebae9c0SAndroid Build Coastguard Worker }
331*bebae9c0SAndroid Build Coastguard Worker SLObjectItf mixObject;
332*bebae9c0SAndroid Build Coastguard Worker result = (*engineEngine)->CreateOutputMix(engineEngine, &mixObject, count, mix_ids, mix_req);
333*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
334*bebae9c0SAndroid Build Coastguard Worker result = (*mixObject)->Realize(mixObject, SL_BOOLEAN_FALSE);
335*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
336*bebae9c0SAndroid Build Coastguard Worker
337*bebae9c0SAndroid Build Coastguard Worker // configure preset reverb on output mix
338*bebae9c0SAndroid Build Coastguard Worker SLPresetReverbItf outputMixPresetReverb;
339*bebae9c0SAndroid Build Coastguard Worker if (outputMixPresetItfRequested) {
340*bebae9c0SAndroid Build Coastguard Worker result = (*mixObject)->GetInterface(mixObject, SL_IID_PRESETREVERB, &outputMixPresetReverb);
341*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
342*bebae9c0SAndroid Build Coastguard Worker SLuint16 getPresetReverb = 12345;
343*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixPresetReverb)->GetPreset(outputMixPresetReverb, &getPresetReverb);
344*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
345*bebae9c0SAndroid Build Coastguard Worker printf("Output mix default preset reverb number = %u\n", getPresetReverb);
346*bebae9c0SAndroid Build Coastguard Worker if (outputMixPresetNumber != ((SLuint16) ~0)) {
347*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixPresetReverb)->SetPreset(outputMixPresetReverb,
348*bebae9c0SAndroid Build Coastguard Worker outputMixPresetNumber);
349*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS == result) {
350*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixPresetReverb)->GetPreset(outputMixPresetReverb,
351*bebae9c0SAndroid Build Coastguard Worker &getPresetReverb);
352*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
353*bebae9c0SAndroid Build Coastguard Worker assert(getPresetReverb == outputMixPresetNumber);
354*bebae9c0SAndroid Build Coastguard Worker printf("Output mix preset reverb successfully changed to %u\n",
355*bebae9c0SAndroid Build Coastguard Worker outputMixPresetNumber);
356*bebae9c0SAndroid Build Coastguard Worker } else {
357*bebae9c0SAndroid Build Coastguard Worker printf("Unable to set output mix preset reverb to %u, result=%u\n",
358*bebae9c0SAndroid Build Coastguard Worker outputMixPresetNumber, result);
359*bebae9c0SAndroid Build Coastguard Worker }
360*bebae9c0SAndroid Build Coastguard Worker }
361*bebae9c0SAndroid Build Coastguard Worker }
362*bebae9c0SAndroid Build Coastguard Worker
363*bebae9c0SAndroid Build Coastguard Worker // configure environmental reverb on output mix
364*bebae9c0SAndroid Build Coastguard Worker SLEnvironmentalReverbItf outputMixEnvironmentalReverb;
365*bebae9c0SAndroid Build Coastguard Worker if (outputMixEnvironmentalItfRequested) {
366*bebae9c0SAndroid Build Coastguard Worker result = (*mixObject)->GetInterface(mixObject, SL_IID_ENVIRONMENTALREVERB,
367*bebae9c0SAndroid Build Coastguard Worker &outputMixEnvironmentalReverb);
368*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
369*bebae9c0SAndroid Build Coastguard Worker SLEnvironmentalReverbSettings getSettings;
370*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixEnvironmentalReverb)->GetEnvironmentalReverbProperties(
371*bebae9c0SAndroid Build Coastguard Worker outputMixEnvironmentalReverb, &getSettings);
372*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
373*bebae9c0SAndroid Build Coastguard Worker printf("Output mix default environmental reverb settings\n");
374*bebae9c0SAndroid Build Coastguard Worker printf("------------------------------------------------\n");
375*bebae9c0SAndroid Build Coastguard Worker slesutPrintEnvironmentalReverbSettings(&getSettings);
376*bebae9c0SAndroid Build Coastguard Worker printf("\n");
377*bebae9c0SAndroid Build Coastguard Worker if (outputMixEnvironmentalName != NULL) {
378*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixEnvironmentalReverb)->SetEnvironmentalReverbProperties(
379*bebae9c0SAndroid Build Coastguard Worker outputMixEnvironmentalReverb, &outputMixEnvironmentalSettings);
380*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
381*bebae9c0SAndroid Build Coastguard Worker printf("Output mix new environmental reverb settings\n");
382*bebae9c0SAndroid Build Coastguard Worker printf("--------------------------------------------\n");
383*bebae9c0SAndroid Build Coastguard Worker slesutPrintEnvironmentalReverbSettings(&outputMixEnvironmentalSettings);
384*bebae9c0SAndroid Build Coastguard Worker printf("\n");
385*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixEnvironmentalReverb)->GetEnvironmentalReverbProperties(
386*bebae9c0SAndroid Build Coastguard Worker outputMixEnvironmentalReverb, &getSettings);
387*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
388*bebae9c0SAndroid Build Coastguard Worker printf("Output mix read environmental reverb settings\n");
389*bebae9c0SAndroid Build Coastguard Worker printf("--------------------------------------------\n");
390*bebae9c0SAndroid Build Coastguard Worker slesutPrintEnvironmentalReverbSettings(&getSettings);
391*bebae9c0SAndroid Build Coastguard Worker printf("\n");
392*bebae9c0SAndroid Build Coastguard Worker if (!slesutCompareEnvironmentalReverbSettings(&getSettings,
393*bebae9c0SAndroid Build Coastguard Worker &outputMixEnvironmentalSettings)) {
394*bebae9c0SAndroid Build Coastguard Worker printf("Warning: new and read are different; check details above\n");
395*bebae9c0SAndroid Build Coastguard Worker } else {
396*bebae9c0SAndroid Build Coastguard Worker printf("New and read match, life is good\n");
397*bebae9c0SAndroid Build Coastguard Worker }
398*bebae9c0SAndroid Build Coastguard Worker }
399*bebae9c0SAndroid Build Coastguard Worker }
400*bebae9c0SAndroid Build Coastguard Worker
401*bebae9c0SAndroid Build Coastguard Worker // create audio player
402*bebae9c0SAndroid Build Coastguard Worker SLDataLocator_URI locURI = {SL_DATALOCATOR_URI, (SLchar *) pathname};
403*bebae9c0SAndroid Build Coastguard Worker SLDataFormat_MIME dfMIME = {SL_DATAFORMAT_MIME, NULL, SL_CONTAINERTYPE_UNSPECIFIED};
404*bebae9c0SAndroid Build Coastguard Worker SLDataSource audioSrc = {&locURI, &dfMIME};
405*bebae9c0SAndroid Build Coastguard Worker SLDataLocator_OutputMix locOutputMix = {SL_DATALOCATOR_OUTPUTMIX, mixObject};
406*bebae9c0SAndroid Build Coastguard Worker SLDataSink audioSnk = {&locOutputMix, NULL};
407*bebae9c0SAndroid Build Coastguard Worker SLInterfaceID player_ids[5];
408*bebae9c0SAndroid Build Coastguard Worker SLboolean player_req[5];
409*bebae9c0SAndroid Build Coastguard Worker count = 0;
410*bebae9c0SAndroid Build Coastguard Worker if (playerPresetItfRequested) {
411*bebae9c0SAndroid Build Coastguard Worker player_req[count] = SL_BOOLEAN_TRUE;
412*bebae9c0SAndroid Build Coastguard Worker player_ids[count++] = SL_IID_PRESETREVERB;
413*bebae9c0SAndroid Build Coastguard Worker }
414*bebae9c0SAndroid Build Coastguard Worker if (playerEnvironmentalItfRequested) {
415*bebae9c0SAndroid Build Coastguard Worker player_req[count] = SL_BOOLEAN_TRUE;
416*bebae9c0SAndroid Build Coastguard Worker player_ids[count++] = SL_IID_ENVIRONMENTALREVERB;
417*bebae9c0SAndroid Build Coastguard Worker }
418*bebae9c0SAndroid Build Coastguard Worker if (outputMixPresetItfRequested || outputMixEnvironmentalItfRequested) {
419*bebae9c0SAndroid Build Coastguard Worker player_req[count] = SL_BOOLEAN_TRUE;
420*bebae9c0SAndroid Build Coastguard Worker player_ids[count++] = SL_IID_EFFECTSEND;
421*bebae9c0SAndroid Build Coastguard Worker }
422*bebae9c0SAndroid Build Coastguard Worker if (loop) {
423*bebae9c0SAndroid Build Coastguard Worker player_req[count] = SL_BOOLEAN_TRUE;
424*bebae9c0SAndroid Build Coastguard Worker player_ids[count++] = SL_IID_SEEK;
425*bebae9c0SAndroid Build Coastguard Worker }
426*bebae9c0SAndroid Build Coastguard Worker player_req[count] = SL_BOOLEAN_TRUE;
427*bebae9c0SAndroid Build Coastguard Worker player_ids[count++] = SL_IID_PREFETCHSTATUS;
428*bebae9c0SAndroid Build Coastguard Worker SLObjectItf playerObject;
429*bebae9c0SAndroid Build Coastguard Worker result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
430*bebae9c0SAndroid Build Coastguard Worker &audioSnk, count, player_ids, player_req);
431*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
432*bebae9c0SAndroid Build Coastguard Worker
433*bebae9c0SAndroid Build Coastguard Worker // realize audio player
434*bebae9c0SAndroid Build Coastguard Worker result = (*playerObject)->Realize(playerObject, SL_BOOLEAN_FALSE);
435*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
436*bebae9c0SAndroid Build Coastguard Worker
437*bebae9c0SAndroid Build Coastguard Worker // if reverb is on output mix (aux effect), then enable it for this player
438*bebae9c0SAndroid Build Coastguard Worker if (outputMixPresetItfRequested || outputMixEnvironmentalItfRequested) {
439*bebae9c0SAndroid Build Coastguard Worker SLEffectSendItf playerEffectSend;
440*bebae9c0SAndroid Build Coastguard Worker result = (*playerObject)->GetInterface(playerObject, SL_IID_EFFECTSEND, &playerEffectSend);
441*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
442*bebae9c0SAndroid Build Coastguard Worker SLboolean enabled;
443*bebae9c0SAndroid Build Coastguard Worker SLmillibel directLevel;
444*bebae9c0SAndroid Build Coastguard Worker SLmillibel sendLevel;
445*bebae9c0SAndroid Build Coastguard Worker if (outputMixPresetItfRequested) {
446*bebae9c0SAndroid Build Coastguard Worker result = (*playerEffectSend)->IsEnabled(playerEffectSend, outputMixPresetReverb,
447*bebae9c0SAndroid Build Coastguard Worker &enabled);
448*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
449*bebae9c0SAndroid Build Coastguard Worker printf("Output mix preset reverb: player effect send default enabled = %s\n",
450*bebae9c0SAndroid Build Coastguard Worker enabled ? "true" : "false");
451*bebae9c0SAndroid Build Coastguard Worker directLevel = 12345;
452*bebae9c0SAndroid Build Coastguard Worker result = (*playerEffectSend)->GetDirectLevel(playerEffectSend, &directLevel);
453*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
454*bebae9c0SAndroid Build Coastguard Worker printf("Output mix preset reverb: player effect send default direct level = %d\n",
455*bebae9c0SAndroid Build Coastguard Worker directLevel);
456*bebae9c0SAndroid Build Coastguard Worker sendLevel = 12345;
457*bebae9c0SAndroid Build Coastguard Worker result = (*playerEffectSend)->GetSendLevel(playerEffectSend, outputMixPresetReverb,
458*bebae9c0SAndroid Build Coastguard Worker &sendLevel);
459*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
460*bebae9c0SAndroid Build Coastguard Worker printf("Output mix preset reverb: player effect send default send level = %d\n",
461*bebae9c0SAndroid Build Coastguard Worker sendLevel);
462*bebae9c0SAndroid Build Coastguard Worker if (outputMixPresetNumber != ((SLuint16) ~0)) {
463*bebae9c0SAndroid Build Coastguard Worker result = (*playerEffectSend)->EnableEffectSend(playerEffectSend,
464*bebae9c0SAndroid Build Coastguard Worker outputMixPresetReverb, SL_BOOLEAN_TRUE, (SLmillibel) 0);
465*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
466*bebae9c0SAndroid Build Coastguard Worker result = (*playerEffectSend)->IsEnabled(playerEffectSend, outputMixPresetReverb,
467*bebae9c0SAndroid Build Coastguard Worker &enabled);
468*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
469*bebae9c0SAndroid Build Coastguard Worker directLevel = 12345;
470*bebae9c0SAndroid Build Coastguard Worker result = (*playerEffectSend)->GetDirectLevel(playerEffectSend, &directLevel);
471*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
472*bebae9c0SAndroid Build Coastguard Worker sendLevel = 12345;
473*bebae9c0SAndroid Build Coastguard Worker result = (*playerEffectSend)->GetSendLevel(playerEffectSend, outputMixPresetReverb,
474*bebae9c0SAndroid Build Coastguard Worker &sendLevel);
475*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
476*bebae9c0SAndroid Build Coastguard Worker printf("Output mix preset reverb: player effect send new enabled = %s, direct level"
477*bebae9c0SAndroid Build Coastguard Worker " = %d, send level = %d\n", enabled ? "true" : "false", directLevel, sendLevel);
478*bebae9c0SAndroid Build Coastguard Worker }
479*bebae9c0SAndroid Build Coastguard Worker }
480*bebae9c0SAndroid Build Coastguard Worker if (outputMixEnvironmentalItfRequested) {
481*bebae9c0SAndroid Build Coastguard Worker if (outputMixEnvironmentalName != NULL) {
482*bebae9c0SAndroid Build Coastguard Worker result = (*playerEffectSend)->IsEnabled(playerEffectSend,
483*bebae9c0SAndroid Build Coastguard Worker outputMixEnvironmentalReverb, &enabled);
484*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
485*bebae9c0SAndroid Build Coastguard Worker printf("Output mix environmental reverb: player effect send default enabled = %s\n",
486*bebae9c0SAndroid Build Coastguard Worker enabled ? "true" : "false");
487*bebae9c0SAndroid Build Coastguard Worker directLevel = 12345;
488*bebae9c0SAndroid Build Coastguard Worker result = (*playerEffectSend)->GetDirectLevel(playerEffectSend, &directLevel);
489*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
490*bebae9c0SAndroid Build Coastguard Worker printf("Output mix environmental reverb: player effect send default direct level"
491*bebae9c0SAndroid Build Coastguard Worker " = %d\n", directLevel);
492*bebae9c0SAndroid Build Coastguard Worker sendLevel = 12345;
493*bebae9c0SAndroid Build Coastguard Worker result = (*playerEffectSend)->GetSendLevel(playerEffectSend,
494*bebae9c0SAndroid Build Coastguard Worker outputMixEnvironmentalReverb, &sendLevel);
495*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
496*bebae9c0SAndroid Build Coastguard Worker printf("Output mix environmental reverb: player effect send default send level"
497*bebae9c0SAndroid Build Coastguard Worker " = %d\n", sendLevel);
498*bebae9c0SAndroid Build Coastguard Worker result = (*playerEffectSend)->EnableEffectSend(playerEffectSend,
499*bebae9c0SAndroid Build Coastguard Worker outputMixEnvironmentalReverb, SL_BOOLEAN_TRUE, (SLmillibel) 0);
500*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
501*bebae9c0SAndroid Build Coastguard Worker result = (*playerEffectSend)->IsEnabled(playerEffectSend,
502*bebae9c0SAndroid Build Coastguard Worker outputMixEnvironmentalReverb, &enabled);
503*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
504*bebae9c0SAndroid Build Coastguard Worker directLevel = 12345;
505*bebae9c0SAndroid Build Coastguard Worker result = (*playerEffectSend)->GetDirectLevel(playerEffectSend, &directLevel);
506*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
507*bebae9c0SAndroid Build Coastguard Worker sendLevel = 12345;
508*bebae9c0SAndroid Build Coastguard Worker result = (*playerEffectSend)->GetSendLevel(playerEffectSend,
509*bebae9c0SAndroid Build Coastguard Worker outputMixEnvironmentalReverb, &sendLevel);
510*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
511*bebae9c0SAndroid Build Coastguard Worker printf("Output mix environmental reverb: player effect send new enabled = %s, "
512*bebae9c0SAndroid Build Coastguard Worker "direct level = %d, send level = %d\n", enabled ? "true" : "false",
513*bebae9c0SAndroid Build Coastguard Worker directLevel, sendLevel);
514*bebae9c0SAndroid Build Coastguard Worker }
515*bebae9c0SAndroid Build Coastguard Worker }
516*bebae9c0SAndroid Build Coastguard Worker }
517*bebae9c0SAndroid Build Coastguard Worker
518*bebae9c0SAndroid Build Coastguard Worker // configure preset reverb on player
519*bebae9c0SAndroid Build Coastguard Worker SLPresetReverbItf playerPresetReverb;
520*bebae9c0SAndroid Build Coastguard Worker if (playerPresetItfRequested) {
521*bebae9c0SAndroid Build Coastguard Worker result = (*playerObject)->GetInterface(playerObject, SL_IID_PRESETREVERB,
522*bebae9c0SAndroid Build Coastguard Worker &playerPresetReverb);
523*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
524*bebae9c0SAndroid Build Coastguard Worker SLuint16 getPresetReverb = 12345;
525*bebae9c0SAndroid Build Coastguard Worker result = (*playerPresetReverb)->GetPreset(playerPresetReverb, &getPresetReverb);
526*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS == result) {
527*bebae9c0SAndroid Build Coastguard Worker printf("Player default preset reverb %u\n", getPresetReverb);
528*bebae9c0SAndroid Build Coastguard Worker if (playerPresetNumber != ((SLuint16) ~0)) {
529*bebae9c0SAndroid Build Coastguard Worker result = (*playerPresetReverb)->SetPreset(playerPresetReverb, playerPresetNumber);
530*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS == result) {
531*bebae9c0SAndroid Build Coastguard Worker result = (*playerPresetReverb)->GetPreset(playerPresetReverb, &getPresetReverb);
532*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
533*bebae9c0SAndroid Build Coastguard Worker assert(getPresetReverb == playerPresetNumber);
534*bebae9c0SAndroid Build Coastguard Worker printf("Player preset reverb successfully changed to %u\n", playerPresetNumber);
535*bebae9c0SAndroid Build Coastguard Worker } else {
536*bebae9c0SAndroid Build Coastguard Worker printf("Unable to set player preset reverb to %u, result=%u\n",
537*bebae9c0SAndroid Build Coastguard Worker playerPresetNumber, result);
538*bebae9c0SAndroid Build Coastguard Worker }
539*bebae9c0SAndroid Build Coastguard Worker }
540*bebae9c0SAndroid Build Coastguard Worker } else {
541*bebae9c0SAndroid Build Coastguard Worker printf("Unable to get player default preset reverb, result=%u\n", result);
542*bebae9c0SAndroid Build Coastguard Worker }
543*bebae9c0SAndroid Build Coastguard Worker }
544*bebae9c0SAndroid Build Coastguard Worker
545*bebae9c0SAndroid Build Coastguard Worker // configure environmental reverb on player
546*bebae9c0SAndroid Build Coastguard Worker SLEnvironmentalReverbItf playerEnvironmentalReverb;
547*bebae9c0SAndroid Build Coastguard Worker if (playerEnvironmentalItfRequested) {
548*bebae9c0SAndroid Build Coastguard Worker result = (*playerObject)->GetInterface(playerObject, SL_IID_ENVIRONMENTALREVERB,
549*bebae9c0SAndroid Build Coastguard Worker &playerEnvironmentalReverb);
550*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
551*bebae9c0SAndroid Build Coastguard Worker SLEnvironmentalReverbSettings getSettings;
552*bebae9c0SAndroid Build Coastguard Worker memset(&getSettings, 0, sizeof(getSettings));
553*bebae9c0SAndroid Build Coastguard Worker result = (*playerEnvironmentalReverb)->GetEnvironmentalReverbProperties(
554*bebae9c0SAndroid Build Coastguard Worker playerEnvironmentalReverb, &getSettings);
555*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS == result) {
556*bebae9c0SAndroid Build Coastguard Worker printf("Player default environmental reverb settings\n");
557*bebae9c0SAndroid Build Coastguard Worker printf("--------------------------------------------\n");
558*bebae9c0SAndroid Build Coastguard Worker slesutPrintEnvironmentalReverbSettings(&getSettings);
559*bebae9c0SAndroid Build Coastguard Worker printf("\n");
560*bebae9c0SAndroid Build Coastguard Worker if (playerEnvironmentalName != NULL) {
561*bebae9c0SAndroid Build Coastguard Worker result = (*playerEnvironmentalReverb)->SetEnvironmentalReverbProperties(
562*bebae9c0SAndroid Build Coastguard Worker playerEnvironmentalReverb, &playerEnvironmentalSettings);
563*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
564*bebae9c0SAndroid Build Coastguard Worker printf("Player new environmental reverb settings\n");
565*bebae9c0SAndroid Build Coastguard Worker printf("----------------------------------------\n");
566*bebae9c0SAndroid Build Coastguard Worker slesutPrintEnvironmentalReverbSettings(&playerEnvironmentalSettings);
567*bebae9c0SAndroid Build Coastguard Worker printf("\n");
568*bebae9c0SAndroid Build Coastguard Worker result = (*playerEnvironmentalReverb)->GetEnvironmentalReverbProperties(
569*bebae9c0SAndroid Build Coastguard Worker playerEnvironmentalReverb, &getSettings);
570*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
571*bebae9c0SAndroid Build Coastguard Worker printf("Player read environmental reverb settings\n");
572*bebae9c0SAndroid Build Coastguard Worker printf("-----------------------------------------\n");
573*bebae9c0SAndroid Build Coastguard Worker slesutPrintEnvironmentalReverbSettings(&getSettings);
574*bebae9c0SAndroid Build Coastguard Worker printf("\n");
575*bebae9c0SAndroid Build Coastguard Worker if (!slesutCompareEnvironmentalReverbSettings(&getSettings,
576*bebae9c0SAndroid Build Coastguard Worker &playerEnvironmentalSettings)) {
577*bebae9c0SAndroid Build Coastguard Worker printf("Warning: new and read are different; check details above\n");
578*bebae9c0SAndroid Build Coastguard Worker } else {
579*bebae9c0SAndroid Build Coastguard Worker printf("New and read match, life is good\n");
580*bebae9c0SAndroid Build Coastguard Worker }
581*bebae9c0SAndroid Build Coastguard Worker }
582*bebae9c0SAndroid Build Coastguard Worker } else {
583*bebae9c0SAndroid Build Coastguard Worker printf("Unable to get player default environmental reverb properties, result=%u\n",
584*bebae9c0SAndroid Build Coastguard Worker result);
585*bebae9c0SAndroid Build Coastguard Worker }
586*bebae9c0SAndroid Build Coastguard Worker }
587*bebae9c0SAndroid Build Coastguard Worker
588*bebae9c0SAndroid Build Coastguard Worker // get the play interface
589*bebae9c0SAndroid Build Coastguard Worker SLPlayItf playerPlay;
590*bebae9c0SAndroid Build Coastguard Worker result = (*playerObject)->GetInterface(playerObject, SL_IID_PLAY, &playerPlay);
591*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
592*bebae9c0SAndroid Build Coastguard Worker
593*bebae9c0SAndroid Build Coastguard Worker // get the prefetch status interface
594*bebae9c0SAndroid Build Coastguard Worker SLPrefetchStatusItf playerPrefetchStatus;
595*bebae9c0SAndroid Build Coastguard Worker result = (*playerObject)->GetInterface(playerObject, SL_IID_PREFETCHSTATUS,
596*bebae9c0SAndroid Build Coastguard Worker &playerPrefetchStatus);
597*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
598*bebae9c0SAndroid Build Coastguard Worker
599*bebae9c0SAndroid Build Coastguard Worker // enable prefetch status callbacks
600*bebae9c0SAndroid Build Coastguard Worker result = (*playerPrefetchStatus)->RegisterCallback(playerPrefetchStatus, prefetch_callback,
601*bebae9c0SAndroid Build Coastguard Worker NULL);
602*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
603*bebae9c0SAndroid Build Coastguard Worker result = (*playerPrefetchStatus)->SetCallbackEventsMask(playerPrefetchStatus,
604*bebae9c0SAndroid Build Coastguard Worker SL_PREFETCHEVENT_STATUSCHANGE | SL_PREFETCHEVENT_FILLLEVELCHANGE);
605*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
606*bebae9c0SAndroid Build Coastguard Worker
607*bebae9c0SAndroid Build Coastguard Worker // set play state to paused to enable pre-fetch so we can get a more reliable duration
608*bebae9c0SAndroid Build Coastguard Worker result = (*playerPlay)->SetPlayState(playerPlay, SL_PLAYSTATE_PAUSED);
609*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
610*bebae9c0SAndroid Build Coastguard Worker
611*bebae9c0SAndroid Build Coastguard Worker // wait for prefetch status callback to indicate either sufficient data or error
612*bebae9c0SAndroid Build Coastguard Worker pthread_mutex_lock(&mutex);
613*bebae9c0SAndroid Build Coastguard Worker while (prefetch_status == SL_PREFETCHSTATUS_UNKNOWN) {
614*bebae9c0SAndroid Build Coastguard Worker pthread_cond_wait(&cond, &mutex);
615*bebae9c0SAndroid Build Coastguard Worker }
616*bebae9c0SAndroid Build Coastguard Worker pthread_mutex_unlock(&mutex);
617*bebae9c0SAndroid Build Coastguard Worker if (prefetch_status == SL_PREFETCHSTATUS_ERROR) {
618*bebae9c0SAndroid Build Coastguard Worker fprintf(stderr, "Error during prefetch, exiting\n");
619*bebae9c0SAndroid Build Coastguard Worker goto destroyRes;
620*bebae9c0SAndroid Build Coastguard Worker }
621*bebae9c0SAndroid Build Coastguard Worker
622*bebae9c0SAndroid Build Coastguard Worker // get the duration
623*bebae9c0SAndroid Build Coastguard Worker SLmillisecond duration;
624*bebae9c0SAndroid Build Coastguard Worker result = (*playerPlay)->GetDuration(playerPlay, &duration);
625*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
626*bebae9c0SAndroid Build Coastguard Worker if (SL_TIME_UNKNOWN == duration) {
627*bebae9c0SAndroid Build Coastguard Worker printf("duration: unknown\n");
628*bebae9c0SAndroid Build Coastguard Worker } else {
629*bebae9c0SAndroid Build Coastguard Worker printf("duration: %.1f seconds\n", duration / 1000.0);
630*bebae9c0SAndroid Build Coastguard Worker }
631*bebae9c0SAndroid Build Coastguard Worker
632*bebae9c0SAndroid Build Coastguard Worker // enable looping
633*bebae9c0SAndroid Build Coastguard Worker if (loop) {
634*bebae9c0SAndroid Build Coastguard Worker SLSeekItf playerSeek;
635*bebae9c0SAndroid Build Coastguard Worker result = (*playerObject)->GetInterface(playerObject, SL_IID_SEEK, &playerSeek);
636*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
637*bebae9c0SAndroid Build Coastguard Worker result = (*playerSeek)->SetLoop(playerSeek, SL_BOOLEAN_TRUE, (SLmillisecond) 0,
638*bebae9c0SAndroid Build Coastguard Worker SL_TIME_UNKNOWN);
639*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
640*bebae9c0SAndroid Build Coastguard Worker }
641*bebae9c0SAndroid Build Coastguard Worker
642*bebae9c0SAndroid Build Coastguard Worker // start audio playing
643*bebae9c0SAndroid Build Coastguard Worker result = (*playerPlay)->SetPlayState(playerPlay, SL_PLAYSTATE_PLAYING);
644*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
645*bebae9c0SAndroid Build Coastguard Worker
646*bebae9c0SAndroid Build Coastguard Worker // wait for audio to finish playing
647*bebae9c0SAndroid Build Coastguard Worker SLuint32 state;
648*bebae9c0SAndroid Build Coastguard Worker for (;;) {
649*bebae9c0SAndroid Build Coastguard Worker result = (*playerPlay)->GetPlayState(playerPlay, &state);
650*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
651*bebae9c0SAndroid Build Coastguard Worker if (SL_PLAYSTATE_PLAYING != state)
652*bebae9c0SAndroid Build Coastguard Worker break;
653*bebae9c0SAndroid Build Coastguard Worker usleep(1000000);
654*bebae9c0SAndroid Build Coastguard Worker }
655*bebae9c0SAndroid Build Coastguard Worker assert(SL_PLAYSTATE_PAUSED == state);
656*bebae9c0SAndroid Build Coastguard Worker
657*bebae9c0SAndroid Build Coastguard Worker destroyRes:
658*bebae9c0SAndroid Build Coastguard Worker // cleanup objects
659*bebae9c0SAndroid Build Coastguard Worker (*playerObject)->Destroy(playerObject);
660*bebae9c0SAndroid Build Coastguard Worker (*mixObject)->Destroy(mixObject);
661*bebae9c0SAndroid Build Coastguard Worker (*engineObject)->Destroy(engineObject);
662*bebae9c0SAndroid Build Coastguard Worker
663*bebae9c0SAndroid Build Coastguard Worker return EXIT_SUCCESS;
664*bebae9c0SAndroid Build Coastguard Worker }
665