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