reverb.c revision 0a058cc3d720cdf3f0f8222472a862258482f34f
17c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project/*
27c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project * Copyright (C) 2010 The Android Open Source Project
37c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project *
47c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
57c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project * you may not use this file except in compliance with the License.
67c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project * You may obtain a copy of the License at
77c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project *
87c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
97c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project *
107c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
117c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
127c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project * See the License for the specific language governing permissions and
147c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project * limitations under the License.
157c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project */
167c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
177c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project// Demonstrate environmental reverb and preset reverb on an output mix and audio player
187c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
197c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project#include "SLES/OpenSLES.h"
20c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <assert.h>
217c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project#include <string.h>
22702ea9d42f52fc145090c0f0bfbe64993e4b8b33Brad Fitzpatrick#include <stdio.h>
23c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <stdlib.h>
24c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <unistd.h>
25c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian
2609eb749704afd9e226e1347cb20c90be2016cd21Christopher Wiley#define bool int
27002e1e58dfe19dd3e49a59c6827cbf51573941a2Mathias Agopian#define false 0
28002e1e58dfe19dd3e49a59c6827cbf51573941a2Mathias Agopian#define true 1
29abf8a2c608cb5f0d1523ab7d0c56e0da8a09cc87Jun Jiang
30002e1e58dfe19dd3e49a59c6827cbf51573941a2Mathias Agopian// Table of I3DL2 named environmental reverb settings
317c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
327c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projecttypedef struct {
337c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    const char *mName;
347c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    SLEnvironmentalReverbSettings mSettings;
3598e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian} Pair;
365707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown
377c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project#define _(name) {#name, SL_I3DL2_ENVIRONMENT_PRESET_##name},
38208059f67ed2dd9fa025e07fcb6954d3cb61c79eMathias Agopian
397e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne HackbornPair pairs[] = {
407c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    _(DEFAULT)
41f50b9eaaeeaeae16981f11b05d3f3a6fb0dea30dArve Hjønnevåg    _(GENERIC)
427c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    _(PADDEDCELL)
437c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    _(ROOM)
447c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    _(BATHROOM)
455707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown    _(LIVINGROOM)
467c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    _(STONEROOM)
477c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    _(AUDITORIUM)
487c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    _(CONCERTHALL)
497c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    _(CAVE)
507c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    _(ARENA)
517c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    _(HANGAR)
529f760150f6e0f39b9923cfdc875373606839ee00Steve Block    _(CARPETEDHALLWAY)
537e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn    _(HALLWAY)
547e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn    _(STONECORRIDOR)
557c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    _(ALLEY)
567c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    _(FOREST)
577c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    _(CITY)
58b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    _(MOUNTAINS)
59b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    _(QUARRY)
60b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    _(PLAIN)
61b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    _(PARKINGLOT)
62b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    _(SEWERPIPE)
63b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    _(UNDERWATER)
64b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    _(SMALLROOM)
65b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    _(MEDIUMROOM)
66b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    _(LARGEROOM)
67b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    _(MEDIUMHALL)
68b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    _(LARGEHALL)
697c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    _(PLATE)
70a877cd85b5a026384542e3271fc310d6a8fe24c6Brad Fitzpatrick};
710c1f5cbb8a41d19195ab49dcfeb5caaea2d3fcdaJeff Sharkey
72a877cd85b5a026384542e3271fc310d6a8fe24c6Brad Fitzpatrick// Reverb parameters for output mix
737c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source ProjectSLuint16 mixPresetNumber = ~0;
747c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectchar *mixEnvName = NULL;
757c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source ProjectSLEnvironmentalReverbSettings mixEnvSettings;
767c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
777c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project// Reverb parameters for audio player
787c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source ProjectSLuint16 playerPresetNumber = ~0;
797c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectchar *playerEnvName = NULL;
807c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source ProjectSLEnvironmentalReverbSettings playerEnvSettings;
817c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
827c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project// Compare two environmental reverb settings structures.
83a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn// Returns true if the settings are identical, or false if they are different.
84a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn
85a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackbornbool slesutCompareEnvronmentalReverbSettings(
86a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn        const SLEnvironmentalReverbSettings *settings1,
8713b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown        const SLEnvironmentalReverbSettings *settings2)
8813b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown{
8913b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown    return
9013b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown        (settings1->roomLevel == settings2->roomLevel) &&
9113b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown        (settings1->roomHFLevel == settings2->roomHFLevel) &&
9213b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown        (settings1->decayTime == settings2->decayTime) &&
9313b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown        (settings1->decayHFRatio == settings2->decayHFRatio) &&
9413b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown        (settings1->reflectionsLevel == settings2->reflectionsLevel) &&
9513b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown        (settings1->reflectionsDelay == settings2->reflectionsDelay) &&
967c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        (settings1->reverbLevel == settings2->reverbLevel) &&
977c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        (settings1->reverbDelay == settings2->reverbDelay) &&
987c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        (settings1->diffusion == settings2->diffusion) &&
997c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        (settings1->density == settings2->density);
1007c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
1017c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
1027c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project// Print an environmental reverb settings structure.
10384e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg
1047c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectvoid slesutPrintEnvironmentalReverbSettings(const SLEnvironmentalReverbSettings *settings)
1057c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
1067c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    printf("roomLevel: %u\n", settings->roomLevel);
1077c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    printf("roomHFLevel: %u\n", settings->roomHFLevel);
10884e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    printf("decayTime: %lu\n", settings->decayTime);
1097c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    printf("decayHFRatio: %u\n", settings->decayHFRatio);
1107c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    printf("reflectionsLevel: %u\n", settings->reflectionsLevel);
1117c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    printf("reflectionsDelay: %lu\n", settings->reflectionsDelay);
1127c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    printf("reverbLevel: %u\n", settings->reverbLevel);
1137c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    printf("reverbDelay: %lu\n", settings->reverbDelay);
1147c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    printf("diffusion: %u\n", settings->diffusion);
1157c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    printf("density: %u\n", settings->density);
1167c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
1177c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
1187c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project// Lookup environmental reverb settings by name
1197c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
1207c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectconst SLEnvironmentalReverbSettings *lookupEnvName(const char *name)
1217c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
1227c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    unsigned j;
1237c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    for (j = 0; j < sizeof(pairs) / sizeof(pairs[0]); ++j) {
1247c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (!strcasecmp(name, pairs[j].mName)) {
1257c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            return &pairs[j].mSettings;
1267c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
1277c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
1287c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return NULL;
1297c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
1306f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross
1317c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project// Print all available environmental reverb names
1327c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
1337c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectvoid printEnvNames(void)
1347c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
1357c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    unsigned j;
1367c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    bool needSpace = false;
1377c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    bool needNewline = false;
1387c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    unsigned lineLen = 0;
1397c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    for (j = 0; j < sizeof(pairs) / sizeof(pairs[0]); ++j) {
14084e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg        const char *name = pairs[j].mName;
1417c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        unsigned nameLen = strlen(name);
1427c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (lineLen + (needSpace ? 1 : 0) + nameLen > 72) {
1437c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            putchar('\n');
1447c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            needSpace = false;
14584e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg            needNewline = false;
1467c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            lineLen = 0;
1477c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
1487c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (needSpace) {
1497c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            putchar(' ');
1507c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            ++lineLen;
1517c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
1527c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        fputs(name, stdout);
1537c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        lineLen += nameLen;
1547c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        needSpace = true;
1557c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        needNewline = true;
1567c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
1577c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (needNewline) {
1587c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        putchar('\n');
1597c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
1607c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
16184e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg
1627c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project// Main program
1637c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
1647c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Projectint main(int argc, char **argv)
1657c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project{
1666f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross    SLresult result;
1677c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
1687c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    // process command line parameters
1697c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    char *prog = argv[0];
1706f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross    int i;
1717c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    for (i = 1; i < argc; ++i) {
1727c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        char *arg = argv[i];
1737c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (arg[0] != '-')
1747c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            break;
1756f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross        if (!strncmp(arg, "--mix-preset=", 13)) {
1767c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            mixPresetNumber = atoi(&arg[13]);
1777c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        } else if (!strncmp(arg, "--mix-name=", 11)) {
1787c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            mixEnvName = &arg[11];
179d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn        } else if (!strncmp(arg, "--player-preset=", 16)) {
1807c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            playerPresetNumber = atoi(&arg[16]);
1817c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        } else if (!strncmp(arg, "--player-name=", 14)) {
1827c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            playerEnvName = &arg[14];
1837c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        } else {
1847c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            fprintf(stderr, "%s: unknown option %s ignored\n", prog, arg);
1857c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
186e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block    }
1877c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (argc - i != 1) {
1887c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        fprintf(stderr, "usage: %s --mix-preset=# --mix-name=I3DL2 --player-preset=# "
1897c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                "--player-name=I3DL2 filename\n", prog);
19007fd0f195db6d341cab4e54257f508d802c98832Arve Hjønnevåg        return EXIT_FAILURE;
1917c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
19284e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    char *pathname = argv[i];
1937c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
1947c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    const SLEnvironmentalReverbSettings *envSettings;
19584e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    if (NULL != mixEnvName) {
19684e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg        envSettings = lookupEnvName(mixEnvName);
1977c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (NULL == envSettings) {
1987c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            fprintf(stderr, "%s: mix environmental reverb name %s not found, "
1997c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                    "available names are:\n", prog, mixEnvName);
20084e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg            printEnvNames();
20184e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg            return EXIT_FAILURE;
2027c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
203d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn        mixEnvSettings = *envSettings;
2047c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
2057c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (NULL != playerEnvName) {
2067c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        envSettings = lookupEnvName(playerEnvName);
2076f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross        if (NULL == envSettings) {
2087c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            fprintf(stderr, "%s: player environmental reverb name %s not found, "
2097c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                    "available names are:\n", prog, playerEnvName);
2107c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            printEnvNames();
211d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn            return EXIT_FAILURE;
2127c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
2137c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        playerEnvSettings = *envSettings;
2147c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
2157c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
2167c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    // create engine
2177c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    SLObjectItf engineObject;
2187c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);
2197c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    assert(SL_RESULT_SUCCESS == result);
220e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block    result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);
2217c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    assert(SL_RESULT_SUCCESS == result);
2227c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    SLEngineItf engineEngine;
2237c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);
22407fd0f195db6d341cab4e54257f508d802c98832Arve Hjønnevåg    assert(SL_RESULT_SUCCESS == result);
2257c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
22684e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    // create output mix
2277c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    SLInterfaceID mix_ids[2];
2287c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    SLboolean mix_req[2];
22984e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    SLuint32 count = 0;
23084e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    if (mixPresetNumber != ((SLuint16) ~0)) {
2317c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mix_req[count] = SL_BOOLEAN_TRUE;
2327c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mix_ids[count++] = SL_IID_PRESETREVERB;
2337c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
234d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn    if (mixEnvName != NULL) {
2357c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mix_req[count] = SL_BOOLEAN_TRUE;
2367c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        mix_ids[count++] = SL_IID_ENVIRONMENTALREVERB;
2377c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
2387c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    SLObjectItf mixObject;
2397c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    result = (*engineEngine)->CreateOutputMix(engineEngine, &mixObject, count, mix_ids, mix_req);
2407c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    assert(SL_RESULT_SUCCESS == result);
2417c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    result = (*mixObject)->Realize(mixObject, SL_BOOLEAN_FALSE);
242e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block    assert(SL_RESULT_SUCCESS == result);
2437c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
24484e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    // configure preset reverb on output mix
24584e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    SLPresetReverbItf mixPresetReverb;
2467c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (mixPresetNumber != ((SLuint16) ~0)) {
247d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn        result = (*mixObject)->GetInterface(mixObject, SL_IID_PRESETREVERB, &mixPresetReverb);
2487c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        assert(SL_RESULT_SUCCESS == result);
2497c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        SLuint16 getPresetReverb = 12345;
25084e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg        result = (*mixPresetReverb)->GetPreset(mixPresetReverb, &getPresetReverb);
25184e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg        assert(SL_RESULT_SUCCESS == result);
2527c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        printf("Output mix default preset reverb %u\n", getPresetReverb);
2537c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        result = (*mixPresetReverb)->SetPreset(mixPresetReverb, mixPresetNumber);
2547c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (SL_RESULT_SUCCESS == result) {
2557c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            result = (*mixPresetReverb)->GetPreset(mixPresetReverb, &getPresetReverb);
2567c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            assert(SL_RESULT_SUCCESS == result);
2576f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross            assert(getPresetReverb == mixPresetNumber);
2586f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross            printf("Output mix preset reverb successfully changed to %u\n", mixPresetNumber);
2597c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        } else
2607c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            printf("Unable to set output mix preset reverb to %u, result=%lu\n", mixPresetNumber,
2617c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                    result);
262d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn    }
2637c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
2647c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    // configure environmental reverb on output mix
2657c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    SLEnvironmentalReverbItf mixEnvironmentalReverb;
2667c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (mixEnvName != NULL) {
267d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn        result = (*mixObject)->GetInterface(mixObject, SL_IID_ENVIRONMENTALREVERB,
2687c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                &mixEnvironmentalReverb);
2697c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        assert(SL_RESULT_SUCCESS == result);
2707c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        SLEnvironmentalReverbSettings getSettings;
27184e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg        result = (*mixEnvironmentalReverb)->GetEnvironmentalReverbProperties(mixEnvironmentalReverb,
2727c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                &getSettings);
2737c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        assert(SL_RESULT_SUCCESS == result);
2747c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        printf("Output mix default environmental reverb settings\n");
2757c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        printf("------------------------------------------------\n");
2767c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        slesutPrintEnvironmentalReverbSettings(&getSettings);
277d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn        printf("\n");
2787c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        result = (*mixEnvironmentalReverb)->SetEnvironmentalReverbProperties(mixEnvironmentalReverb,
2797c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                &mixEnvSettings);
2807c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        assert(SL_RESULT_SUCCESS == result);
2817c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        printf("Output mix new environmental reverb settings\n");
2827c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        printf("--------------------------------------------\n");
2837c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        slesutPrintEnvironmentalReverbSettings(&mixEnvSettings);
2847c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        printf("\n");
2857c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        result = (*mixEnvironmentalReverb)->GetEnvironmentalReverbProperties(mixEnvironmentalReverb,
286d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn                &getSettings);
2877c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        assert(SL_RESULT_SUCCESS == result);
2887c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        printf("Output mix read environmental reverb settings\n");
2897c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        printf("--------------------------------------------\n");
29084e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg        slesutPrintEnvironmentalReverbSettings(&getSettings);
2917c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        printf("\n");
2927c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (!slesutCompareEnvronmentalReverbSettings(&getSettings, &mixEnvSettings)) {
29384e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg            printf("Warning: new and read are different; check details above\n");
2947c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        } else {
29584e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg            printf("New and read match, life is good\n");
29684e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg        }
2977c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
2987c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
2997c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    // create audio player
3007c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    SLDataLocator_URI locURI = {SL_DATALOCATOR_URI, (SLchar *) pathname};
3017c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    SLDataFormat_MIME dfMIME = {SL_DATAFORMAT_MIME, NULL, SL_CONTAINERTYPE_UNSPECIFIED};
3027c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    SLDataSource audioSrc = {&locURI, &dfMIME};
3037c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    SLDataLocator_OutputMix locOutputMix = {SL_DATALOCATOR_OUTPUTMIX, mixObject};
3047c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    SLDataSink audioSnk = {&locOutputMix, NULL};
3057c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    SLInterfaceID player_ids[4];
3067c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    SLboolean player_req[4];
3077c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    count = 0;
3087c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (playerPresetNumber != ((SLuint16) ~0)) {
3097c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        player_req[count] = SL_BOOLEAN_TRUE;
3107c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        player_ids[count++] = SL_IID_PRESETREVERB;
3117c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
3127c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (playerEnvName != NULL) {
3137c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        player_req[count] = SL_BOOLEAN_TRUE;
3147c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        player_ids[count++] = SL_IID_ENVIRONMENTALREVERB;
3157e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn    }
3167c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (mixPresetNumber != ((SLuint16) ~0) || mixEnvName != NULL) {
3177c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        player_req[count] = SL_BOOLEAN_TRUE;
3187c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        player_ids[count++] = SL_IID_EFFECTSEND;
3197c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
3207c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    player_req[count] = SL_BOOLEAN_TRUE;
3217c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    player_ids[count++] = SL_IID_PREFETCHSTATUS;
3227e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn    SLObjectItf playerObject;
3237e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
3247e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn        &audioSnk, count, player_ids, player_req);
3257e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn    assert(SL_RESULT_SUCCESS == result);
326a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn
327a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn    // realize audio player
328a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn    result = (*playerObject)->Realize(playerObject, SL_BOOLEAN_FALSE);
329a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn    assert(SL_RESULT_SUCCESS == result);
3307e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn
3317e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn    // if reverb is on output mix (aux effect), then enable it for this player
3327e790af756d7891cb1cf1374bb283a8fbcbe6b49Dianne Hackborn    if (mixPresetNumber != ((SLuint16) ~0) || mixEnvName != NULL) {
333a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn        SLEffectSendItf playerEffectSend;
334a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn        result = (*playerObject)->GetInterface(playerObject, SL_IID_EFFECTSEND, &playerEffectSend);
335a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn        assert(SL_RESULT_SUCCESS == result);
336a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4Dianne Hackborn        if (mixPresetNumber != ((SLuint16) ~0)) {
3377c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            result = (*playerEffectSend)->EnableEffectSend(playerEffectSend, mixPresetReverb,
3387c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                    SL_BOOLEAN_TRUE, (SLmillibel) 0);
3397c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            assert(SL_RESULT_SUCCESS == result);
3407c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
3417c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (mixEnvName != NULL) {
3427c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            result = (*playerEffectSend)->EnableEffectSend(playerEffectSend, mixEnvironmentalReverb,
3437c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                    SL_BOOLEAN_TRUE, (SLmillibel) 0);
3447c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            assert(SL_RESULT_SUCCESS == result);
3457c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        }
3467c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
3477c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
3487c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    // configure preset reverb on player
3497c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    SLPresetReverbItf playerPresetReverb;
3507c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (playerPresetNumber != ((SLuint16) ~0)) {
3517c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        result = (*playerObject)->GetInterface(playerObject, SL_IID_PRESETREVERB,
3527c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                &playerPresetReverb);
3537c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        assert(SL_RESULT_SUCCESS == result);
3547c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        SLuint16 getPresetReverb = 12345;
3557c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        result = (*playerPresetReverb)->GetPreset(playerPresetReverb, &getPresetReverb);
3567c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        assert(SL_RESULT_SUCCESS == result);
3577c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        printf("Player default preset reverb %u\n", getPresetReverb);
3587c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        result = (*playerPresetReverb)->SetPreset(playerPresetReverb, playerPresetNumber);
3597c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (SL_RESULT_SUCCESS == result) {
3607c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            result = (*playerPresetReverb)->GetPreset(playerPresetReverb, &getPresetReverb);
3617c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            assert(SL_RESULT_SUCCESS == result);
3627c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            assert(getPresetReverb == playerPresetNumber);
3637c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            printf("Player preset reverb successfully changed to %u\n", playerPresetNumber);
3647c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        } else
3657c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            printf("Unable to set player preset reverb to %u, result=%lu\n", playerPresetNumber,
3667c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                    result);
3677c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
3687c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
3697c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    // configure environmental reverb on player
3707c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    SLEnvironmentalReverbItf playerEnvironmentalReverb;
3717c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (playerEnvName != NULL) {
372b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        result = (*playerObject)->GetInterface(playerObject, SL_IID_ENVIRONMENTALREVERB,
373b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich                &playerEnvironmentalReverb);
374b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        assert(SL_RESULT_SUCCESS == result);
375b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        SLEnvironmentalReverbSettings getSettings;
376b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        memset(&getSettings, 0, sizeof(getSettings));
377b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        result = (*playerEnvironmentalReverb)->GetEnvironmentalReverbProperties(
3787c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                playerEnvironmentalReverb, &getSettings);
3797c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        assert(SL_RESULT_SUCCESS == result);
3807c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        printf("Player default environmental reverb settings\n");
3817c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        printf("--------------------------------------------\n");
382d4ecccfd206604a9b2d8a1220844fc2df85a5998Mark Salyzyn        slesutPrintEnvironmentalReverbSettings(&getSettings);
3837c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        printf("\n");
3847c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        result = (*playerEnvironmentalReverb)->SetEnvironmentalReverbProperties(
3857c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project                playerEnvironmentalReverb, &playerEnvSettings);
3867c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        assert(SL_RESULT_SUCCESS == result);
3877c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        printf("Player new environmental reverb settings\n");
3887c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        printf("----------------------------------------\n");
389b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        slesutPrintEnvironmentalReverbSettings(&playerEnvSettings);
390b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        printf("\n");
391b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        result = (*playerEnvironmentalReverb)->GetEnvironmentalReverbProperties(
392b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich                playerEnvironmentalReverb, &getSettings);
393b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        assert(SL_RESULT_SUCCESS == result);
394b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        printf("Player read environmental reverb settings\n");
3957c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        printf("-----------------------------------------\n");
3967c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        slesutPrintEnvironmentalReverbSettings(&getSettings);
3977c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        printf("\n");
3987c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (!slesutCompareEnvronmentalReverbSettings(&getSettings, &playerEnvSettings)) {
3997c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            printf("Warning: new and read are different; check details above\n");
4007c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        } else {
401b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich            printf("New and read match, life is good\n");
402b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich        }
403b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    }
404b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
405b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    // get the play interface
406b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    SLPlayItf playerPlay;
40797e2bcd76021b31c5064fd3f669bc3f450b4c952Dianne Hackborn    result = (*playerObject)->GetInterface(playerObject, SL_IID_PLAY, &playerPlay);
4087c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    assert(SL_RESULT_SUCCESS == result);
4097c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
4107c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    // set play state to paused to enable pre-fetch so we can get a more reliable duration
4117c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    result = (*playerPlay)->SetPlayState(playerPlay, SL_PLAYSTATE_PAUSED);
4127c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    assert(SL_RESULT_SUCCESS == result);
413b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
414b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    // get the prefetch status interface
415b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    SLPrefetchStatusItf playerPrefetchStatus;
416b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    result = (*playerObject)->GetInterface(playerObject, SL_IID_PREFETCHSTATUS,
417b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich            &playerPrefetchStatus);
418b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    assert(SL_RESULT_SUCCESS == result);
4197c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
4207c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    // poll prefetch status to detect when it completes
4217c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    SLuint32 prefetchStatus = SL_PREFETCHSTATUS_UNDERFLOW;
4227c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    SLuint32 timeOutIndex = 100; // 10s
4237c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    while ((prefetchStatus != SL_PREFETCHSTATUS_SUFFICIENTDATA) && (timeOutIndex > 0)) {
4247c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        usleep(100 * 1000);
4257c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        (*playerPrefetchStatus)->GetPrefetchStatus(playerPrefetchStatus, &prefetchStatus);
4267c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        timeOutIndex--;
4277c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
42851faf46e2958c57dab46d9420e585319125c7c42Andreas Huber    if (timeOutIndex == 0) {
4297c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        fprintf(stderr, "\nWe\'re done waiting, failed to prefetch data in time, exiting\n");
4307c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        goto destroyRes;
4317c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
43251faf46e2958c57dab46d9420e585319125c7c42Andreas Huber
43384e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg    // get the duration
4347c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    SLmillisecond duration;
4357c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    result = (*playerPlay)->GetDuration(playerPlay, &duration);
4367c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    assert(SL_RESULT_SUCCESS == result);
4377c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    if (SL_TIME_UNKNOWN == duration) {
4387c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        printf("duration: unknown\n");
4397c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    } else {
4407c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        printf("duration: %.1f seconds\n", duration / 1000.0);
4417c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    }
442b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
443b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    // start audio playing
444b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    result = (*playerPlay)->SetPlayState(playerPlay, SL_PLAYSTATE_PLAYING);
445b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    assert(SL_RESULT_SUCCESS == result);
446b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich
447b6b1423c87e457097875dc304fbbe38db6c41abdNick Kralevich    // wait for audio to finish playing
4487c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    SLuint32 state;
4497c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    for (;;) {
4507c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        result = (*playerPlay)->GetPlayState(playerPlay, &state);
4517c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        assert(SL_RESULT_SUCCESS == result);
4527c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        if (SL_PLAYSTATE_PLAYING != state)
4537c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project            break;
4547c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project        usleep(1000000);
4557c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project     }
4567c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    assert(SL_PLAYSTATE_PAUSED == state);
4577c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
45827182be9f20f4f5b48316666429f09b9ecc1f22eChristopher TatedestroyRes:
4597c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    // cleanup objects
4607c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    (*playerObject)->Destroy(playerObject);
4617c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    (*mixObject)->Destroy(mixObject);
4627c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    (*engineObject)->Destroy(engineObject);
4637c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project
4647c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project    return EXIT_SUCCESS;
4657c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project}
4667c1b96a165f970a09ed239bb4fb3f1b0d8f2a40The Android Open Source Project