aboutsummaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/alconvolve.c36
-rw-r--r--examples/alffplay.cpp12
-rw-r--r--examples/alhrtf.c2
-rw-r--r--examples/allatency.c2
-rw-r--r--examples/alloopback.c2
-rw-r--r--examples/almultireverb.c6
-rw-r--r--examples/alplay.c2
-rw-r--r--examples/alreverb.c4
-rw-r--r--examples/alstreamcb.cpp4
-rw-r--r--examples/altonegen.c75
10 files changed, 77 insertions, 68 deletions
diff --git a/examples/alconvolve.c b/examples/alconvolve.c
index 93fd2eb4..8580d443 100644
--- a/examples/alconvolve.c
+++ b/examples/alconvolve.c
@@ -22,7 +22,7 @@
* THE SOFTWARE.
*/
-/* This file contains an example for applying convolution reverb to a source. */
+/* This file contains an example for applying convolution to a source. */
#include <assert.h>
#include <inttypes.h>
@@ -39,9 +39,9 @@
#include "common/alhelpers.h"
-#ifndef AL_SOFT_convolution_reverb
-#define AL_SOFT_convolution_reverb
-#define AL_EFFECT_CONVOLUTION_REVERB_SOFT 0xA000
+#ifndef AL_SOFT_convolution_effect
+#define AL_SOFT_convolution_effect
+#define AL_EFFECT_CONVOLUTION_SOFT 0xA000
#endif
@@ -278,21 +278,21 @@ static int UpdatePlayer(StreamPlayer *player)
}
-/* CreateEffect creates a new OpenAL effect object with a convolution reverb
- * type, and returns the new effect ID.
+/* CreateEffect creates a new OpenAL effect object with a convolution type, and
+ * returns the new effect ID.
*/
static ALuint CreateEffect(void)
{
ALuint effect = 0;
ALenum err;
- printf("Using Convolution Reverb\n");
+ printf("Using Convolution\n");
- /* Create the effect object and set the convolution reverb effect type. */
+ /* Create the effect object and set the convolution effect type. */
alGenEffects(1, &effect);
- alEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_CONVOLUTION_REVERB_SOFT);
+ alEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_CONVOLUTION_SOFT);
- /* Check if an error occured, and clean up if so. */
+ /* Check if an error occurred, and clean up if so. */
err = alGetError();
if(err != AL_NO_ERROR)
{
@@ -391,7 +391,7 @@ static ALuint LoadSound(const char *filename)
free(membuf);
sf_close(sndfile);
- /* Check if an error occured, and clean up if so. */
+ /* Check if an error occurred, and clean up if so. */
err = alGetError();
if(err != AL_NO_ERROR)
{
@@ -423,10 +423,10 @@ int main(int argc, char **argv)
if(InitAL(&argv, &argc) != 0)
return 1;
- if(!alIsExtensionPresent("AL_SOFTX_convolution_reverb"))
+ if(!alIsExtensionPresent("AL_SOFTX_convolution_effect"))
{
CloseAL();
- fprintf(stderr, "Error: Convolution revern not supported\n");
+ fprintf(stderr, "Error: Convolution effect not supported\n");
return 1;
}
@@ -500,11 +500,11 @@ int main(int argc, char **argv)
alGenAuxiliaryEffectSlots(1, &slot);
/* Set the impulse response sound buffer on the effect slot. This allows
- * effects to access it as needed. In this case, convolution reverb uses it
- * as the filter source. NOTE: Unlike the effect object, the buffer *is*
- * kept referenced and may not be changed or deleted as long as it's set,
- * just like with a source. When another buffer is set, or the effect slot
- * is deleted, the buffer reference is released.
+ * effects to access it as needed. In this case, convolution uses it as the
+ * filter source. NOTE: Unlike the effect object, the buffer *is* kept
+ * referenced and may not be changed or deleted as long as it's set, just
+ * like with a source. When another buffer is set, or the effect slot is
+ * deleted, the buffer reference is released.
*
* The effect slot's gain is reduced because the impulse responses I've
* tested with result in excessively loud reverb. Is that normal? Even with
diff --git a/examples/alffplay.cpp b/examples/alffplay.cpp
index ae40a51a..1f02ef70 100644
--- a/examples/alffplay.cpp
+++ b/examples/alffplay.cpp
@@ -339,14 +339,14 @@ struct AudioState {
}
static void AL_APIENTRY eventCallbackC(ALenum eventType, ALuint object, ALuint param,
- ALsizei length, const ALchar *message, void *userParam)
+ ALsizei length, const ALchar *message, void *userParam) noexcept
{ static_cast<AudioState*>(userParam)->eventCallback(eventType, object, param, length, message); }
void eventCallback(ALenum eventType, ALuint object, ALuint param, ALsizei length,
- const ALchar *message);
+ const ALchar *message) noexcept;
- static ALsizei AL_APIENTRY bufferCallbackC(void *userptr, void *data, ALsizei size)
+ static ALsizei AL_APIENTRY bufferCallbackC(void *userptr, void *data, ALsizei size) noexcept
{ return static_cast<AudioState*>(userptr)->bufferCallback(data, size); }
- ALsizei bufferCallback(void *data, ALsizei size);
+ ALsizei bufferCallback(void *data, ALsizei size) noexcept;
nanoseconds getClockNoLock();
nanoseconds getClock()
@@ -840,7 +840,7 @@ bool AudioState::readAudio(int sample_skip)
void AL_APIENTRY AudioState::eventCallback(ALenum eventType, ALuint object, ALuint param,
- ALsizei length, const ALchar *message)
+ ALsizei length, const ALchar *message) noexcept
{
if(eventType == AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT)
{
@@ -878,7 +878,7 @@ void AL_APIENTRY AudioState::eventCallback(ALenum eventType, ALuint object, ALui
}
}
-ALsizei AudioState::bufferCallback(void *data, ALsizei size)
+ALsizei AudioState::bufferCallback(void *data, ALsizei size) noexcept
{
ALsizei got{0};
diff --git a/examples/alhrtf.c b/examples/alhrtf.c
index d878870e..7ea1b99e 100644
--- a/examples/alhrtf.c
+++ b/examples/alhrtf.c
@@ -121,7 +121,7 @@ static ALuint LoadSound(const char *filename)
free(membuf);
sf_close(sndfile);
- /* Check if an error occured, and clean up if so. */
+ /* Check if an error occurred, and clean up if so. */
err = alGetError();
if(err != AL_NO_ERROR)
{
diff --git a/examples/allatency.c b/examples/allatency.c
index ab4a4ebc..01f4eb69 100644
--- a/examples/allatency.c
+++ b/examples/allatency.c
@@ -124,7 +124,7 @@ static ALuint LoadSound(const char *filename)
free(membuf);
sf_close(sndfile);
- /* Check if an error occured, and clean up if so. */
+ /* Check if an error occurred, and clean up if so. */
err = alGetError();
if(err != AL_NO_ERROR)
{
diff --git a/examples/alloopback.c b/examples/alloopback.c
index 56cd420f..964a0cdb 100644
--- a/examples/alloopback.c
+++ b/examples/alloopback.c
@@ -118,7 +118,7 @@ static ALuint CreateSineWave(void)
alGenBuffers(1, &buffer);
alBufferData(buffer, AL_FORMAT_MONO16, data, sizeof(data), 44100);
- /* Check if an error occured, and clean up if so. */
+ /* Check if an error occurred, and clean up if so. */
err = alGetError();
if(err != AL_NO_ERROR)
{
diff --git a/examples/almultireverb.c b/examples/almultireverb.c
index a77cc59e..dcb76c87 100644
--- a/examples/almultireverb.c
+++ b/examples/almultireverb.c
@@ -137,7 +137,7 @@ static int LoadEffect(ALuint effect, const EFXEAXREVERBPROPERTIES *reverb)
alEffectf(effect, AL_EAXREVERB_ROOM_ROLLOFF_FACTOR, reverb->flRoomRolloffFactor);
alEffecti(effect, AL_EAXREVERB_DECAY_HFLIMIT, reverb->iDecayHFLimit);
- /* Check if an error occured, and return failure if so. */
+ /* Check if an error occurred, and return failure if so. */
if((err=alGetError()) != AL_NO_ERROR)
{
fprintf(stderr, "Error setting up reverb: %s\n", alGetString(err));
@@ -210,7 +210,7 @@ static ALuint LoadSound(const char *filename)
free(membuf);
sf_close(sndfile);
- /* Check if an error occured, and clean up if so. */
+ /* Check if an error occurred, and clean up if so. */
err = alGetError();
if(err != AL_NO_ERROR)
{
@@ -493,7 +493,7 @@ int main(int argc, char **argv)
}
if(argc < 1)
{
- fprintf(stderr, "No filename spacified.\n");
+ fprintf(stderr, "No filename specified.\n");
CloseAL();
return 1;
}
diff --git a/examples/alplay.c b/examples/alplay.c
index 4291cb47..1eabcccd 100644
--- a/examples/alplay.c
+++ b/examples/alplay.c
@@ -266,7 +266,7 @@ static ALuint LoadSound(const char *filename)
free(membuf);
sf_close(sndfile);
- /* Check if an error occured, and clean up if so. */
+ /* Check if an error occurred, and clean up if so. */
err = alGetError();
if(err != AL_NO_ERROR)
{
diff --git a/examples/alreverb.c b/examples/alreverb.c
index 11a3ac6b..ff49db25 100644
--- a/examples/alreverb.c
+++ b/examples/alreverb.c
@@ -132,7 +132,7 @@ static ALuint LoadEffect(const EFXEAXREVERBPROPERTIES *reverb)
alEffecti(effect, AL_REVERB_DECAY_HFLIMIT, reverb->iDecayHFLimit);
}
- /* Check if an error occured, and clean up if so. */
+ /* Check if an error occurred, and clean up if so. */
err = alGetError();
if(err != AL_NO_ERROR)
{
@@ -219,7 +219,7 @@ static ALuint LoadSound(const char *filename)
free(membuf);
sf_close(sndfile);
- /* Check if an error occured, and clean up if so. */
+ /* Check if an error occurred, and clean up if so. */
err = alGetError();
if(err != AL_NO_ERROR)
{
diff --git a/examples/alstreamcb.cpp b/examples/alstreamcb.cpp
index a2e7b659..6cc24034 100644
--- a/examples/alstreamcb.cpp
+++ b/examples/alstreamcb.cpp
@@ -276,9 +276,9 @@ struct StreamPlayer {
* but it allows the callback implementation to have a nice 'this' pointer
* with normal member access.
*/
- static ALsizei AL_APIENTRY bufferCallbackC(void *userptr, void *data, ALsizei size)
+ static ALsizei AL_APIENTRY bufferCallbackC(void *userptr, void *data, ALsizei size) noexcept
{ return static_cast<StreamPlayer*>(userptr)->bufferCallback(data, size); }
- ALsizei bufferCallback(void *data, ALsizei size)
+ ALsizei bufferCallback(void *data, ALsizei size) noexcept
{
/* NOTE: The callback *MUST* be real-time safe! That means no blocking,
* no allocations or deallocations, no I/O, no page faults, or calls to
diff --git a/examples/altonegen.c b/examples/altonegen.c
index 75db2d6b..ec7f77bb 100644
--- a/examples/altonegen.c
+++ b/examples/altonegen.c
@@ -79,63 +79,72 @@ static inline ALuint dither_rng(ALuint *seed)
return *seed;
}
-static void ApplySin(ALfloat *data, ALdouble g, ALuint srate, ALuint freq)
+static void ApplySin(ALfloat *data, ALuint length, ALdouble g, ALuint srate, ALuint freq)
{
- ALdouble smps_per_cycle = (ALdouble)srate / freq;
+ ALdouble cycles_per_sample = (ALdouble)freq / srate;
ALuint i;
- for(i = 0;i < srate;i++)
+ for(i = 0;i < length;i++)
{
ALdouble ival;
- data[i] += (ALfloat)(sin(modf(i/smps_per_cycle, &ival) * 2.0*M_PI) * g);
+ data[i] += (ALfloat)(sin(modf(i*cycles_per_sample, &ival) * 2.0*M_PI) * g);
}
}
/* Generates waveforms using additive synthesis. Each waveform is constructed
* by summing one or more sine waves, up to (and excluding) nyquist.
*/
-static ALuint CreateWave(enum WaveType type, ALuint freq, ALuint srate, ALfloat gain)
+static ALuint CreateWave(enum WaveType type, ALuint seconds, ALuint freq, ALuint srate,
+ ALfloat gain)
{
ALuint seed = 22222;
+ ALuint num_samples;
ALuint data_size;
ALfloat *data;
ALuint buffer;
ALenum err;
ALuint i;
- data_size = (ALuint)(srate * sizeof(ALfloat));
+ if(seconds > INT_MAX / srate / sizeof(ALfloat))
+ {
+ fprintf(stderr, "Too many seconds: %u * %u * %zu > %d\n", seconds, srate, sizeof(ALfloat),
+ INT_MAX);
+ return 0;
+ }
+
+ num_samples = seconds * srate;
+
+ data_size = (ALuint)(num_samples * sizeof(ALfloat));
data = calloc(1, data_size);
switch(type)
{
case WT_Sine:
- ApplySin(data, 1.0, srate, freq);
+ ApplySin(data, num_samples, 1.0, srate, freq);
break;
case WT_Square:
for(i = 1;freq*i < srate/2;i+=2)
- ApplySin(data, 4.0/M_PI * 1.0/i, srate, freq*i);
+ ApplySin(data, num_samples, 4.0/M_PI * 1.0/i, srate, freq*i);
break;
case WT_Sawtooth:
for(i = 1;freq*i < srate/2;i++)
- ApplySin(data, 2.0/M_PI * ((i&1)*2 - 1.0) / i, srate, freq*i);
+ ApplySin(data, num_samples, 2.0/M_PI * ((i&1)*2 - 1.0) / i, srate, freq*i);
break;
case WT_Triangle:
for(i = 1;freq*i < srate/2;i+=2)
- ApplySin(data, 8.0/(M_PI*M_PI) * (1.0 - (i&2)) / (i*i), srate, freq*i);
+ ApplySin(data, num_samples, 8.0/(M_PI*M_PI) * (1.0 - (i&2)) / (i*i), srate, freq*i);
break;
case WT_Impulse:
/* NOTE: Impulse isn't handled using additive synthesis, and is
- * instead just a non-0 sample at a given rate. This can still be
- * useful to test (other than resampling, the ALSOFT_DEFAULT_REVERB
- * environment variable can prove useful here to test the reverb
- * response).
+ * instead just a non-0 sample. This can be useful to test (other
+ * than resampling, the ALSOFT_DEFAULT_REVERB environment variable
+ * can test the reverb response).
*/
- for(i = 0;i < srate;i++)
- data[i] = (i%(srate/freq)) ? 0.0f : 1.0f;
+ data[0] = 1.0f;
break;
case WT_WhiteNoise:
/* NOTE: WhiteNoise is just uniform set of uncorrelated values, and
* is not influenced by the waveform frequency.
*/
- for(i = 0;i < srate;i++)
+ for(i = 0;i < num_samples;i++)
{
ALuint rng0 = dither_rng(&seed);
ALuint rng1 = dither_rng(&seed);
@@ -146,7 +155,7 @@ static ALuint CreateWave(enum WaveType type, ALuint freq, ALuint srate, ALfloat
if(gain != 1.0f)
{
- for(i = 0;i < srate;i++)
+ for(i = 0;i < num_samples;i++)
data[i] *= gain;
}
@@ -156,7 +165,7 @@ static ALuint CreateWave(enum WaveType type, ALuint freq, ALuint srate, ALfloat
alBufferData(buffer, AL_FORMAT_MONO_FLOAT32, data, (ALsizei)data_size, (ALsizei)srate);
free(data);
- /* Check if an error occured, and clean up if so. */
+ /* Check if an error occurred, and clean up if so. */
err = alGetError();
if(err != AL_NO_ERROR)
{
@@ -175,8 +184,8 @@ int main(int argc, char *argv[])
enum WaveType wavetype = WT_Sine;
const char *appname = argv[0];
ALuint source, buffer;
- ALint last_pos, num_loops;
- ALint max_loops = 4;
+ ALint last_pos;
+ ALint seconds = 4;
ALint srate = -1;
ALint tone_freq = 1000;
ALCint dev_rate;
@@ -220,7 +229,9 @@ int main(int argc, char *argv[])
else if(i+1 < argc && strcmp(argv[i], "-t") == 0)
{
i++;
- max_loops = atoi(argv[i]) - 1;
+ seconds = atoi(argv[i]);
+ if(seconds <= 0)
+ seconds = 4;
}
else if(i+1 < argc && (strcmp(argv[i], "--waveform") == 0 || strcmp(argv[i], "-w") == 0))
{
@@ -281,7 +292,7 @@ int main(int argc, char *argv[])
srate = dev_rate;
/* Load the sound into a buffer. */
- buffer = CreateWave(wavetype, (ALuint)tone_freq, (ALuint)srate, gain);
+ buffer = CreateWave(wavetype, (ALuint)seconds, (ALuint)tone_freq, (ALuint)srate, gain);
if(!buffer)
{
CloseAL();
@@ -289,7 +300,7 @@ int main(int argc, char *argv[])
}
printf("Playing %dhz %s-wave tone with %dhz sample rate and %dhz output, for %d second%s...\n",
- tone_freq, GetWaveTypeName(wavetype), srate, dev_rate, max_loops+1, max_loops?"s":"");
+ tone_freq, GetWaveTypeName(wavetype), srate, dev_rate, seconds, (seconds!=1)?"s":"");
fflush(stdout);
/* Create the source to play the sound with. */
@@ -299,21 +310,19 @@ int main(int argc, char *argv[])
assert(alGetError()==AL_NO_ERROR && "Failed to setup sound source");
/* Play the sound for a while. */
- num_loops = 0;
- last_pos = 0;
- alSourcei(source, AL_LOOPING, (max_loops > 0) ? AL_TRUE : AL_FALSE);
+ last_pos = -1;
alSourcePlay(source);
do {
ALint pos;
al_nssleep(10000000);
- alGetSourcei(source, AL_SAMPLE_OFFSET, &pos);
alGetSourcei(source, AL_SOURCE_STATE, &state);
- if(pos < last_pos && state == AL_PLAYING)
+ alGetSourcei(source, AL_SAMPLE_OFFSET, &pos);
+ pos /= srate;
+
+ if(pos > last_pos)
{
- ++num_loops;
- if(num_loops >= max_loops)
- alSourcei(source, AL_LOOPING, AL_FALSE);
- printf("%d...\n", max_loops - num_loops + 1);
+ last_pos = 0;
+ printf("%d...\n", seconds - pos);
fflush(stdout);
}
last_pos = pos;