reverb.c revision 04186529e0bcdfa543aa67013fb6d44bf4a1fbbe
19e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten/* 29e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten * Copyright (C) 2010 The Android Open Source Project 39e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten * 49e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 59e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten * you may not use this file except in compliance with the License. 69e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten * You may obtain a copy of the License at 79e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten * 89e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 99e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten * 109e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten * Unless required by applicable law or agreed to in writing, software 119e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 129e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten * See the License for the specific language governing permissions and 149e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten * limitations under the License. 159e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten */ 169e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 179e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten// Demonstrate environmental reverb and preset reverb on an output mix and audio player 189e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 199e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten#include "SLES/OpenSLES.h" 209e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten#include <assert.h> 219e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten#include <string.h> 229e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten#include <stdio.h> 239e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten#include <stdlib.h> 24c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten#include <unistd.h> 259e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 260a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten#define bool int 270a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten#define false 0 280a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten#define true 1 290a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten 309e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten// Table of I3DL2 named environmental reverb settings 319e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 329e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kastentypedef struct { 339e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten const char *mName; 349e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten SLEnvironmentalReverbSettings mSettings; 359e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten} Pair; 369e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 379e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten#define _(name) {#name, SL_I3DL2_ENVIRONMENT_PRESET_##name}, 389e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 399e60b0a390d780539459f41c2bf4a45a326a7b62Glenn KastenPair pairs[] = { 409e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(DEFAULT) 419e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(GENERIC) 429e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(PADDEDCELL) 439e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(ROOM) 449e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(BATHROOM) 459e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(LIVINGROOM) 469e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(STONEROOM) 479e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(AUDITORIUM) 489e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(CONCERTHALL) 499e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(CAVE) 509e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(ARENA) 519e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(HANGAR) 529e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(CARPETEDHALLWAY) 539e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(HALLWAY) 549e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(STONECORRIDOR) 559e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(ALLEY) 569e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(FOREST) 579e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(CITY) 589e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(MOUNTAINS) 599e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(QUARRY) 609e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(PLAIN) 619e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(PARKINGLOT) 629e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(SEWERPIPE) 639e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(UNDERWATER) 649e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(SMALLROOM) 659e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(MEDIUMROOM) 669e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(LARGEROOM) 679e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(MEDIUMHALL) 689e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(LARGEHALL) 699e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten _(PLATE) 709e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten}; 719e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 7204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten// Parameters for preset reverb on output mix 7304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kastenbool outputMixPresetItfRequested = false; 7404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn KastenSLuint16 outputMixPresetNumber = ~0; 759e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 7604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten// Parameters for environmental reverb on output mix 7704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kastenbool outputMixEnvironmentalItfRequested = false; 7804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kastenchar *outputMixEnvironmentalName = NULL; 7904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn KastenSLEnvironmentalReverbSettings outputMixEnvironmentalSettings; 8004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten 8104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten// Parameters for preset reverb on audio player (not supported) 8204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kastenbool playerPresetItfRequested = false; 830a058cc3d720cdf3f0f8222472a862258482f34fGlenn KastenSLuint16 playerPresetNumber = ~0; 8404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten 8504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten// Parameters for environmental reverb on audio player (not supported) 8604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kastenbool playerEnvironmentalItfRequested = false; 8704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kastenchar *playerEnvironmentalName = NULL; 8804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn KastenSLEnvironmentalReverbSettings playerEnvironmentalSettings; 899e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 909e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten// Compare two environmental reverb settings structures. 919e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten// Returns true if the settings are identical, or false if they are different. 929e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 9304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kastenbool slesutCompareEnvironmentalReverbSettings( 949e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten const SLEnvironmentalReverbSettings *settings1, 959e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten const SLEnvironmentalReverbSettings *settings2) 969e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten{ 979e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten return 989e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten (settings1->roomLevel == settings2->roomLevel) && 999e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten (settings1->roomHFLevel == settings2->roomHFLevel) && 1009e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten (settings1->decayTime == settings2->decayTime) && 1019e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten (settings1->decayHFRatio == settings2->decayHFRatio) && 1029e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten (settings1->reflectionsLevel == settings2->reflectionsLevel) && 1039e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten (settings1->reflectionsDelay == settings2->reflectionsDelay) && 1049e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten (settings1->reverbLevel == settings2->reverbLevel) && 1059e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten (settings1->reverbDelay == settings2->reverbDelay) && 1069e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten (settings1->diffusion == settings2->diffusion) && 1079e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten (settings1->density == settings2->density); 1089e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten} 1099e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 1109e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten// Print an environmental reverb settings structure. 1119e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 11261c8274a30ba403191b05d556d063fa5f309ea95Glenn Kastenvoid slesutPrintEnvironmentalReverbSettings(const SLEnvironmentalReverbSettings *settings) 1139e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten{ 11404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("roomLevel: %d\n", settings->roomLevel); 11504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("roomHFLevel: %d\n", settings->roomHFLevel); 11604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("decayTime: %ld\n", settings->decayTime); 11704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("decayHFRatio: %d\n", settings->decayHFRatio); 11804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("reflectionsLevel: %d\n", settings->reflectionsLevel); 11904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("reflectionsDelay: %ld\n", settings->reflectionsDelay); 12004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("reverbLevel: %d\n", settings->reverbLevel); 12104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("reverbDelay: %ld\n", settings->reverbDelay); 12204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("diffusion: %d\n", settings->diffusion); 12304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("density: %d\n", settings->density); 1249e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten} 1259e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 1260a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten// Lookup environmental reverb settings by name 1270a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten 1280a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kastenconst SLEnvironmentalReverbSettings *lookupEnvName(const char *name) 1290a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten{ 1300a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten unsigned j; 1310a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten for (j = 0; j < sizeof(pairs) / sizeof(pairs[0]); ++j) { 1320a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten if (!strcasecmp(name, pairs[j].mName)) { 1330a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten return &pairs[j].mSettings; 1340a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten } 1350a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten } 1360a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten return NULL; 1370a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten} 1380a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten 1390a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten// Print all available environmental reverb names 1400a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten 1410a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kastenvoid printEnvNames(void) 1420a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten{ 1430a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten unsigned j; 1440a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten bool needSpace = false; 1450a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten bool needNewline = false; 1460a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten unsigned lineLen = 0; 1470a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten for (j = 0; j < sizeof(pairs) / sizeof(pairs[0]); ++j) { 1480a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten const char *name = pairs[j].mName; 1490a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten unsigned nameLen = strlen(name); 1500a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten if (lineLen + (needSpace ? 1 : 0) + nameLen > 72) { 1510a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten putchar('\n'); 1520a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten needSpace = false; 1530a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten needNewline = false; 1540a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten lineLen = 0; 1550a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten } 1560a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten if (needSpace) { 1570a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten putchar(' '); 1580a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten ++lineLen; 1590a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten } 1600a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten fputs(name, stdout); 1610a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten lineLen += nameLen; 1620a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten needSpace = true; 1630a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten needNewline = true; 1640a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten } 1650a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten if (needNewline) { 1660a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten putchar('\n'); 1670a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten } 1680a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten} 1690a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten 1709e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten// Main program 1719e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 1729e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kastenint main(int argc, char **argv) 1739e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten{ 1749e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten SLresult result; 1759e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 1769e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten // process command line parameters 1779e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten char *prog = argv[0]; 1789e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten int i; 1799e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten for (i = 1; i < argc; ++i) { 1809e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten char *arg = argv[i]; 1819e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten if (arg[0] != '-') 1829e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten break; 18304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten bool bad = false; // whether the option string is invalid 18404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (!strncmp(arg, "--mix-preset", 12)) { 18504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if ('\0' == arg[12]) { 18604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten outputMixPresetItfRequested = true; 18704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } else if ('=' == arg[12]) { 18804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten outputMixPresetNumber = atoi(&arg[13]); 18904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten outputMixPresetItfRequested = true; 19004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } else { 19104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten bad = true; 19204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } 19304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } else if (!strncmp(arg, "--mix-name", 10)) { 19404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if ('\0' == arg[10]) { 19504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten outputMixEnvironmentalItfRequested = true; 19604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } else if ('=' == arg[10]) { 19704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten outputMixEnvironmentalName = &arg[11]; 19804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten outputMixEnvironmentalItfRequested = true; 19904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } else { 20004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten bad = true; 20104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } 20204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } else if (!strncmp(arg, "--player-preset", 15)) { 20304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if ('\0' == arg[15]) { 20404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten playerPresetItfRequested = true; 20504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } else if ('=' == arg[15]) { 20604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten playerPresetNumber = atoi(&arg[16]); 20704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten playerPresetItfRequested = true; 20804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } else { 20904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten bad = true; 21004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } 21104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } else if (!strncmp(arg, "--player-name", 13)) { 21204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if ('\0' == arg[13]) { 21304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten playerEnvironmentalItfRequested = true; 21404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } else if ('=' == arg[13]) { 21504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten playerEnvironmentalName = &arg[14]; 21604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten playerEnvironmentalItfRequested = true; 21704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } else { 21804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten bad = true; 21904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } 2209e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten } else { 22104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten bad = true; 22204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } 22304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (bad) { 2249e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten fprintf(stderr, "%s: unknown option %s ignored\n", prog, arg); 2259e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten } 2269e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten } 2279e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten if (argc - i != 1) { 2280a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten fprintf(stderr, "usage: %s --mix-preset=# --mix-name=I3DL2 --player-preset=# " 2290a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten "--player-name=I3DL2 filename\n", prog); 23061c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten return EXIT_FAILURE; 2319e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten } 2329e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten char *pathname = argv[i]; 2339e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 2340a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten const SLEnvironmentalReverbSettings *envSettings; 23504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (NULL != outputMixEnvironmentalName) { 23604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten envSettings = lookupEnvName(outputMixEnvironmentalName); 2370a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten if (NULL == envSettings) { 23804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten fprintf(stderr, "%s: output mix environmental reverb name %s not found, " 23904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten "available names are:\n", prog, outputMixEnvironmentalName); 2400a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten printEnvNames(); 2410a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten return EXIT_FAILURE; 2429e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten } 24304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten outputMixEnvironmentalSettings = *envSettings; 2440a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten } 24504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (NULL != playerEnvironmentalName) { 24604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten envSettings = lookupEnvName(playerEnvironmentalName); 2470a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten if (NULL == envSettings) { 2480a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten fprintf(stderr, "%s: player environmental reverb name %s not found, " 24904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten "available names are:\n", prog, playerEnvironmentalName); 2500a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten printEnvNames(); 2510a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten return EXIT_FAILURE; 25261c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten } 25304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten playerEnvironmentalSettings = *envSettings; 2549e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten } 2559e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 2569e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten // create engine 2579e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten SLObjectItf engineObject; 2589e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL); 2599e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten assert(SL_RESULT_SUCCESS == result); 2609e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE); 2619e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten assert(SL_RESULT_SUCCESS == result); 2629e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten SLEngineItf engineEngine; 2639e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine); 2649e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten assert(SL_RESULT_SUCCESS == result); 2659e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 2669e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten // create output mix 2679e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten SLInterfaceID mix_ids[2]; 2689e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten SLboolean mix_req[2]; 2699e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten SLuint32 count = 0; 27004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (outputMixPresetItfRequested) { 2719e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten mix_req[count] = SL_BOOLEAN_TRUE; 2729e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten mix_ids[count++] = SL_IID_PRESETREVERB; 2739e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten } 27404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (outputMixEnvironmentalItfRequested) { 2759e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten mix_req[count] = SL_BOOLEAN_TRUE; 2769e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten mix_ids[count++] = SL_IID_ENVIRONMENTALREVERB; 2779e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten } 2789e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten SLObjectItf mixObject; 2799e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten result = (*engineEngine)->CreateOutputMix(engineEngine, &mixObject, count, mix_ids, mix_req); 2809e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten assert(SL_RESULT_SUCCESS == result); 2819e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten result = (*mixObject)->Realize(mixObject, SL_BOOLEAN_FALSE); 2829e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten assert(SL_RESULT_SUCCESS == result); 2839e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 2849e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten // configure preset reverb on output mix 28504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten SLPresetReverbItf outputMixPresetReverb; 28604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (outputMixPresetItfRequested) { 28704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*mixObject)->GetInterface(mixObject, SL_IID_PRESETREVERB, &outputMixPresetReverb); 2889e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten assert(SL_RESULT_SUCCESS == result); 2899e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten SLuint16 getPresetReverb = 12345; 29004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*outputMixPresetReverb)->GetPreset(outputMixPresetReverb, &getPresetReverb); 2919e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten assert(SL_RESULT_SUCCESS == result); 29204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Output mix default preset reverb number = %u\n", getPresetReverb); 29304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (outputMixPresetNumber != ((SLuint16) ~0)) { 29404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*outputMixPresetReverb)->SetPreset(outputMixPresetReverb, 29504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten outputMixPresetNumber); 29604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (SL_RESULT_SUCCESS == result) { 29704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*outputMixPresetReverb)->GetPreset(outputMixPresetReverb, 29804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten &getPresetReverb); 29904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten assert(SL_RESULT_SUCCESS == result); 30004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten assert(getPresetReverb == outputMixPresetNumber); 30104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Output mix preset reverb successfully changed to %u\n", 30204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten outputMixPresetNumber); 30304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } else { 30404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Unable to set output mix preset reverb to %u, result=%lu\n", 30504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten outputMixPresetNumber, result); 30604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } 30704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } 3089e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten } 3099e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 3109e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten // configure environmental reverb on output mix 31104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten SLEnvironmentalReverbItf outputMixEnvironmentalReverb; 31204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (outputMixEnvironmentalItfRequested) { 3139e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten result = (*mixObject)->GetInterface(mixObject, SL_IID_ENVIRONMENTALREVERB, 31404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten &outputMixEnvironmentalReverb); 3159e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten assert(SL_RESULT_SUCCESS == result); 3169e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten SLEnvironmentalReverbSettings getSettings; 31704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*outputMixEnvironmentalReverb)->GetEnvironmentalReverbProperties( 31804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten outputMixEnvironmentalReverb, &getSettings); 3199e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten assert(SL_RESULT_SUCCESS == result); 3209e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten printf("Output mix default environmental reverb settings\n"); 3219e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten printf("------------------------------------------------\n"); 3229e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten slesutPrintEnvironmentalReverbSettings(&getSettings); 3239e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten printf("\n"); 32404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (outputMixEnvironmentalName != NULL) { 32504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*outputMixEnvironmentalReverb)->SetEnvironmentalReverbProperties( 32604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten outputMixEnvironmentalReverb, &outputMixEnvironmentalSettings); 32704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten assert(SL_RESULT_SUCCESS == result); 32804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Output mix new environmental reverb settings\n"); 32904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("--------------------------------------------\n"); 33004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten slesutPrintEnvironmentalReverbSettings(&outputMixEnvironmentalSettings); 33104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("\n"); 33204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*outputMixEnvironmentalReverb)->GetEnvironmentalReverbProperties( 33304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten outputMixEnvironmentalReverb, &getSettings); 33404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten assert(SL_RESULT_SUCCESS == result); 33504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Output mix read environmental reverb settings\n"); 33604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("--------------------------------------------\n"); 33704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten slesutPrintEnvironmentalReverbSettings(&getSettings); 33804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("\n"); 33904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (!slesutCompareEnvironmentalReverbSettings(&getSettings, 34004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten &outputMixEnvironmentalSettings)) { 34104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Warning: new and read are different; check details above\n"); 34204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } else { 34304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("New and read match, life is good\n"); 34404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } 34561c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten } 3469e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten } 3479e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 3489e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten // create audio player 349e629abc58c2acadc7487ea71c1e063f8f8989199Glenn Kasten SLDataLocator_URI locURI = {SL_DATALOCATOR_URI, (SLchar *) pathname}; 3509e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten SLDataFormat_MIME dfMIME = {SL_DATAFORMAT_MIME, NULL, SL_CONTAINERTYPE_UNSPECIFIED}; 3519e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten SLDataSource audioSrc = {&locURI, &dfMIME}; 3529e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten SLDataLocator_OutputMix locOutputMix = {SL_DATALOCATOR_OUTPUTMIX, mixObject}; 3539e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten SLDataSink audioSnk = {&locOutputMix, NULL}; 35461c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten SLInterfaceID player_ids[4]; 35561c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten SLboolean player_req[4]; 3569e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten count = 0; 35704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (playerPresetItfRequested) { 3589e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten player_req[count] = SL_BOOLEAN_TRUE; 3599e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten player_ids[count++] = SL_IID_PRESETREVERB; 3609e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten } 36104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (playerEnvironmentalItfRequested) { 3629e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten player_req[count] = SL_BOOLEAN_TRUE; 3639e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten player_ids[count++] = SL_IID_ENVIRONMENTALREVERB; 3649e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten } 36504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (outputMixPresetItfRequested || outputMixEnvironmentalItfRequested) { 3669e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten player_req[count] = SL_BOOLEAN_TRUE; 3679e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten player_ids[count++] = SL_IID_EFFECTSEND; 3689e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten } 36961c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten player_req[count] = SL_BOOLEAN_TRUE; 37061c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten player_ids[count++] = SL_IID_PREFETCHSTATUS; 3719e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten SLObjectItf playerObject; 3729e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc, 3739e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten &audioSnk, count, player_ids, player_req); 3749e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten assert(SL_RESULT_SUCCESS == result); 3759e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 37661c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten // realize audio player 37761c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten result = (*playerObject)->Realize(playerObject, SL_BOOLEAN_FALSE); 3789e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten assert(SL_RESULT_SUCCESS == result); 3799e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 38061c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten // if reverb is on output mix (aux effect), then enable it for this player 38104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (outputMixPresetItfRequested || outputMixEnvironmentalItfRequested) { 3829e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten SLEffectSendItf playerEffectSend; 3839e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten result = (*playerObject)->GetInterface(playerObject, SL_IID_EFFECTSEND, &playerEffectSend); 3849e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten assert(SL_RESULT_SUCCESS == result); 38504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten SLboolean enabled; 38604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten SLmillibel directLevel; 38704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten SLmillibel sendLevel; 38804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (outputMixPresetItfRequested) { 38904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*playerEffectSend)->IsEnabled(playerEffectSend, outputMixPresetReverb, 39004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten &enabled); 3919e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten assert(SL_RESULT_SUCCESS == result); 39204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Output mix preset reverb: player effect send default enabled = %s\n", 39304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten enabled ? "true" : "false"); 39404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten directLevel = 12345; 39504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*playerEffectSend)->GetDirectLevel(playerEffectSend, &directLevel); 3969e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten assert(SL_RESULT_SUCCESS == result); 39704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Output mix preset reverb: player effect send default direct level = %d\n", 39804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten directLevel); 39904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten sendLevel = 12345; 40004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*playerEffectSend)->GetSendLevel(playerEffectSend, outputMixPresetReverb, 40104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten &sendLevel); 40204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten assert(SL_RESULT_SUCCESS == result); 40304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Output mix preset reverb: player effect send default send level = %d\n", 40404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten sendLevel); 40504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (outputMixPresetNumber != ((SLuint16) ~0)) { 40604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*playerEffectSend)->EnableEffectSend(playerEffectSend, 40704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten outputMixPresetReverb, SL_BOOLEAN_TRUE, (SLmillibel) 0); 40804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten assert(SL_RESULT_SUCCESS == result); 40904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*playerEffectSend)->IsEnabled(playerEffectSend, outputMixPresetReverb, 41004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten &enabled); 41104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten assert(SL_RESULT_SUCCESS == result); 41204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten directLevel = 12345; 41304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*playerEffectSend)->GetDirectLevel(playerEffectSend, &directLevel); 41404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten assert(SL_RESULT_SUCCESS == result); 41504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten sendLevel = 12345; 41604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*playerEffectSend)->GetSendLevel(playerEffectSend, outputMixPresetReverb, 41704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten &sendLevel); 41804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten assert(SL_RESULT_SUCCESS == result); 41904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Output mix preset reverb: player effect send new enabled = %s, direct level" 42004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten " = %d, send level = %d\n", enabled ? "true" : "false", directLevel, sendLevel); 42104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } 42204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } 42304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (outputMixEnvironmentalItfRequested) { 42404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (outputMixEnvironmentalName != NULL) { 42504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*playerEffectSend)->IsEnabled(playerEffectSend, 42604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten outputMixEnvironmentalReverb, &enabled); 42704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten assert(SL_RESULT_SUCCESS == result); 42804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Output mix environmental reverb: player effect send default enabled = %s\n", 42904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten enabled ? "true" : "false"); 43004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten directLevel = 12345; 43104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*playerEffectSend)->GetDirectLevel(playerEffectSend, &directLevel); 43204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten assert(SL_RESULT_SUCCESS == result); 43304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Output mix environmental reverb: player effect send default direct level" 43404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten " = %d\n", directLevel); 43504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten sendLevel = 12345; 43604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*playerEffectSend)->GetSendLevel(playerEffectSend, 43704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten outputMixEnvironmentalReverb, &sendLevel); 43804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten assert(SL_RESULT_SUCCESS == result); 43904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Output mix environmental reverb: player effect send default send level" 44004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten " = %d\n", sendLevel); 44104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*playerEffectSend)->EnableEffectSend(playerEffectSend, 44204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten outputMixEnvironmentalReverb, SL_BOOLEAN_TRUE, (SLmillibel) 0); 44304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten assert(SL_RESULT_SUCCESS == result); 44404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*playerEffectSend)->IsEnabled(playerEffectSend, 44504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten outputMixEnvironmentalReverb, &enabled); 44604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten assert(SL_RESULT_SUCCESS == result); 44704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten directLevel = 12345; 44804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*playerEffectSend)->GetDirectLevel(playerEffectSend, &directLevel); 44904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten assert(SL_RESULT_SUCCESS == result); 45004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten sendLevel = 12345; 45104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*playerEffectSend)->GetSendLevel(playerEffectSend, 45204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten outputMixEnvironmentalReverb, &sendLevel); 45304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten assert(SL_RESULT_SUCCESS == result); 45404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Output mix environmental reverb: player effect send new enabled = %s, " 45504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten "direct level = %d, send level = %d\n", enabled ? "true" : "false", 45604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten directLevel, sendLevel); 45704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } 4589e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten } 4599e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten } 4609e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 4610a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten // configure preset reverb on player 4620a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten SLPresetReverbItf playerPresetReverb; 46304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (playerPresetItfRequested) { 4640a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten result = (*playerObject)->GetInterface(playerObject, SL_IID_PRESETREVERB, 4650a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten &playerPresetReverb); 4660a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten assert(SL_RESULT_SUCCESS == result); 4670a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten SLuint16 getPresetReverb = 12345; 4680a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten result = (*playerPresetReverb)->GetPreset(playerPresetReverb, &getPresetReverb); 4690a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten if (SL_RESULT_SUCCESS == result) { 47004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Player default preset reverb %u\n", getPresetReverb); 47104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (playerPresetNumber != ((SLuint16) ~0)) { 47204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*playerPresetReverb)->SetPreset(playerPresetReverb, playerPresetNumber); 47304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (SL_RESULT_SUCCESS == result) { 47404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*playerPresetReverb)->GetPreset(playerPresetReverb, &getPresetReverb); 47504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten assert(SL_RESULT_SUCCESS == result); 47604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten assert(getPresetReverb == playerPresetNumber); 47704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Player preset reverb successfully changed to %u\n", playerPresetNumber); 47804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } else { 47904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Unable to set player preset reverb to %u, result=%lu\n", 48004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten playerPresetNumber, result); 48104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } 48204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } 48304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } else { 48404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Unable to get player default preset reverb, result=%lu\n", result); 48504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } 4860a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten } 4870a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten 4880a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten // configure environmental reverb on player 4890a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten SLEnvironmentalReverbItf playerEnvironmentalReverb; 49004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (playerEnvironmentalItfRequested) { 4910a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten result = (*playerObject)->GetInterface(playerObject, SL_IID_ENVIRONMENTALREVERB, 4920a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten &playerEnvironmentalReverb); 4930a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten assert(SL_RESULT_SUCCESS == result); 4940a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten SLEnvironmentalReverbSettings getSettings; 4950a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten memset(&getSettings, 0, sizeof(getSettings)); 4960a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten result = (*playerEnvironmentalReverb)->GetEnvironmentalReverbProperties( 4970a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten playerEnvironmentalReverb, &getSettings); 49804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (SL_RESULT_SUCCESS == result) { 49904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Player default environmental reverb settings\n"); 50004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("--------------------------------------------\n"); 50104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten slesutPrintEnvironmentalReverbSettings(&getSettings); 50204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("\n"); 50304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (playerEnvironmentalName != NULL) { 50404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*playerEnvironmentalReverb)->SetEnvironmentalReverbProperties( 50504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten playerEnvironmentalReverb, &playerEnvironmentalSettings); 50604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten assert(SL_RESULT_SUCCESS == result); 50704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Player new environmental reverb settings\n"); 50804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("----------------------------------------\n"); 50904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten slesutPrintEnvironmentalReverbSettings(&playerEnvironmentalSettings); 51004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("\n"); 51104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result = (*playerEnvironmentalReverb)->GetEnvironmentalReverbProperties( 51204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten playerEnvironmentalReverb, &getSettings); 51304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten assert(SL_RESULT_SUCCESS == result); 51404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Player read environmental reverb settings\n"); 51504186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("-----------------------------------------\n"); 51604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten slesutPrintEnvironmentalReverbSettings(&getSettings); 51704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("\n"); 51804186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten if (!slesutCompareEnvironmentalReverbSettings(&getSettings, 51904186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten &playerEnvironmentalSettings)) { 52004186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Warning: new and read are different; check details above\n"); 52104186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } else { 52204186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("New and read match, life is good\n"); 52304186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } 52404186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten } 5250a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten } else { 52604186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten printf("Unable to get player default environmental reverb properties, result=%lu\n", 52704186529e0bcdfa543aa67013fb6d44bf4a1fbbeGlenn Kasten result); 5280a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten } 5290a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten } 5300a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten 53161c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten // get the play interface 53261c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten SLPlayItf playerPlay; 53361c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten result = (*playerObject)->GetInterface(playerObject, SL_IID_PLAY, &playerPlay); 53461c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten assert(SL_RESULT_SUCCESS == result); 53561c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten 53661c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten // set play state to paused to enable pre-fetch so we can get a more reliable duration 53761c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten result = (*playerPlay)->SetPlayState(playerPlay, SL_PLAYSTATE_PAUSED); 53861c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten assert(SL_RESULT_SUCCESS == result); 53961c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten 54061c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten // get the prefetch status interface 54161c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten SLPrefetchStatusItf playerPrefetchStatus; 5420a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten result = (*playerObject)->GetInterface(playerObject, SL_IID_PREFETCHSTATUS, 5430a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten &playerPrefetchStatus); 54461c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten assert(SL_RESULT_SUCCESS == result); 54561c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten 54661c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten // poll prefetch status to detect when it completes 54761c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten SLuint32 prefetchStatus = SL_PREFETCHSTATUS_UNDERFLOW; 54861c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten SLuint32 timeOutIndex = 100; // 10s 54961c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten while ((prefetchStatus != SL_PREFETCHSTATUS_SUFFICIENTDATA) && (timeOutIndex > 0)) { 55061c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten usleep(100 * 1000); 55161c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten (*playerPrefetchStatus)->GetPrefetchStatus(playerPrefetchStatus, &prefetchStatus); 55261c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten timeOutIndex--; 55361c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten } 55461c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten if (timeOutIndex == 0) { 55561c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten fprintf(stderr, "\nWe\'re done waiting, failed to prefetch data in time, exiting\n"); 55661c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten goto destroyRes; 55761c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten } 55861c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten 55961c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten // get the duration 56061c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten SLmillisecond duration; 56161c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten result = (*playerPlay)->GetDuration(playerPlay, &duration); 56261c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten assert(SL_RESULT_SUCCESS == result); 56361c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten if (SL_TIME_UNKNOWN == duration) { 56461c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten printf("duration: unknown\n"); 56561c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten } else { 56661c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten printf("duration: %.1f seconds\n", duration / 1000.0); 56761c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten } 56861c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten 5699e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten // start audio playing 5709e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten result = (*playerPlay)->SetPlayState(playerPlay, SL_PLAYSTATE_PLAYING); 5719e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten assert(SL_RESULT_SUCCESS == result); 5729e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 5739e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten // wait for audio to finish playing 5749e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten SLuint32 state; 5759e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten for (;;) { 5769e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten result = (*playerPlay)->GetPlayState(playerPlay, &state); 5779e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten assert(SL_RESULT_SUCCESS == result); 5789e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten if (SL_PLAYSTATE_PLAYING != state) 5799e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten break; 58061c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten usleep(1000000); 5819e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten } 5829e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten assert(SL_PLAYSTATE_PAUSED == state); 5839e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten 58461c8274a30ba403191b05d556d063fa5f309ea95Glenn KastendestroyRes: 58561c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten // cleanup objects 58661c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten (*playerObject)->Destroy(playerObject); 58761c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten (*mixObject)->Destroy(mixObject); 58861c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten (*engineObject)->Destroy(engineObject); 58961c8274a30ba403191b05d556d063fa5f309ea95Glenn Kasten 5909e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten return EXIT_SUCCESS; 5919e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten} 592