summaryrefslogtreecommitdiff
path: root/portaudio/examples
diff options
context:
space:
mode:
authorsanine <sanine.not@pm.me>2022-08-27 23:52:56 -0500
committersanine <sanine.not@pm.me>2022-08-27 23:52:56 -0500
commita4dd0ad63c00f4dee3b86dfd3075d1d61b2b3180 (patch)
tree13bd5bfa15e6fea2a12f176bae79adf9c6fd0933 /portaudio/examples
parentbde3e4f1bb7b8f8abca0884a7d994ee1c17a66b1 (diff)
add plibsys
Diffstat (limited to 'portaudio/examples')
-rw-r--r--portaudio/examples/CMakeLists.txt41
-rw-r--r--portaudio/examples/pa_devs.c252
-rw-r--r--portaudio/examples/pa_fuzz.c183
-rw-r--r--portaudio/examples/paex_mono_asio_channel_select.c167
-rw-r--r--portaudio/examples/paex_ocean_shore.c533
-rw-r--r--portaudio/examples/paex_pink.c280
-rw-r--r--portaudio/examples/paex_read_write_wire.c204
-rw-r--r--portaudio/examples/paex_record.c353
-rw-r--r--portaudio/examples/paex_record_file.c457
-rw-r--r--portaudio/examples/paex_saw.c133
-rw-r--r--portaudio/examples/paex_sine.c175
-rw-r--r--portaudio/examples/paex_sine_c++.cpp275
-rw-r--r--portaudio/examples/paex_wmme_ac3.c220
-rw-r--r--portaudio/examples/paex_wmme_surround.c210
-rw-r--r--portaudio/examples/paex_write_sine.c166
-rw-r--r--portaudio/examples/paex_write_sine_nonint.c167
16 files changed, 0 insertions, 3816 deletions
diff --git a/portaudio/examples/CMakeLists.txt b/portaudio/examples/CMakeLists.txt
deleted file mode 100644
index f96b6ec..0000000
--- a/portaudio/examples/CMakeLists.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-# Example projects
-
-MACRO(ADD_EXAMPLE appl_name)
- ADD_EXECUTABLE(${appl_name} "${appl_name}.c")
- TARGET_LINK_LIBRARIES(${appl_name} portaudio_static)
- SET_TARGET_PROPERTIES(${appl_name} PROPERTIES FOLDER "Examples C")
- IF(WIN32)
- SET_PROPERTY(TARGET ${appl_name} APPEND_STRING PROPERTY COMPILE_DEFINITIONS _CRT_SECURE_NO_WARNINGS)
- ENDIF()
-ENDMACRO(ADD_EXAMPLE)
-
-MACRO(ADD_EXAMPLE_CPP appl_name)
- ADD_EXECUTABLE(${appl_name} "${appl_name}.cpp")
- TARGET_LINK_LIBRARIES(${appl_name} portaudio_static)
- SET_TARGET_PROPERTIES(${appl_name} PROPERTIES FOLDER "Examples C++")
- IF(WIN32)
- SET_PROPERTY(TARGET ${appl_name} APPEND_STRING PROPERTY COMPILE_DEFINITIONS _CRT_SECURE_NO_WARNINGS)
- ENDIF()
-ENDMACRO(ADD_EXAMPLE_CPP)
-
-ADD_EXAMPLE(pa_devs)
-ADD_EXAMPLE(pa_fuzz)
-IF(PA_USE_ASIO AND WIN32)
- ADD_EXAMPLE(paex_mono_asio_channel_select)
-ENDIF()
-ADD_EXAMPLE(paex_ocean_shore)
-TARGET_INCLUDE_DIRECTORIES(paex_ocean_shore PRIVATE ../src/common)
-ADD_EXAMPLE(paex_pink)
-ADD_EXAMPLE(paex_read_write_wire)
-ADD_EXAMPLE(paex_record)
-ADD_EXAMPLE(paex_record_file)
-TARGET_INCLUDE_DIRECTORIES(paex_record_file PRIVATE ../src/common)
-ADD_EXAMPLE(paex_saw)
-ADD_EXAMPLE(paex_sine)
-ADD_EXAMPLE_CPP(paex_sine_c++)
-IF(PA_USE_WMME AND WIN32)
- ADD_EXAMPLE(paex_wmme_ac3)
- ADD_EXAMPLE(paex_wmme_surround)
-ENDIF()
-ADD_EXAMPLE(paex_write_sine)
-ADD_EXAMPLE(paex_write_sine_nonint)
diff --git a/portaudio/examples/pa_devs.c b/portaudio/examples/pa_devs.c
deleted file mode 100644
index 27acfd5..0000000
--- a/portaudio/examples/pa_devs.c
+++ /dev/null
@@ -1,252 +0,0 @@
-/** @file pa_devs.c
- @ingroup examples_src
- @brief List available devices, including device information.
- @author Phil Burk http://www.softsynth.com
-
- @note Define PA_USE_ASIO=0 to compile this code on Windows without
- ASIO support.
-*/
-/*
- * $Id$
- *
- * This program uses the PortAudio Portable Audio Library.
- * For more information see: http://www.portaudio.com
- * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The text above constitutes the entire PortAudio license; however,
- * the PortAudio community also makes the following non-binding requests:
- *
- * Any person wishing to distribute modifications to the Software is
- * requested to send the modifications to the original developer so that
- * they can be incorporated into the canonical version. It is also
- * requested that these non-binding requests be included along with the
- * license above.
- */
-
-#include <stdio.h>
-#include <math.h>
-#include "portaudio.h"
-
-#ifdef WIN32
-#include <windows.h>
-
-#if PA_USE_ASIO
-#include "pa_asio.h"
-#endif
-#endif
-
-/*******************************************************************/
-static void PrintSupportedStandardSampleRates(
- const PaStreamParameters *inputParameters,
- const PaStreamParameters *outputParameters )
-{
- static double standardSampleRates[] = {
- 8000.0, 9600.0, 11025.0, 12000.0, 16000.0, 22050.0, 24000.0, 32000.0,
- 44100.0, 48000.0, 88200.0, 96000.0, 192000.0, -1 /* negative terminated list */
- };
- int i, printCount;
- PaError err;
-
- printCount = 0;
- for( i=0; standardSampleRates[i] > 0; i++ )
- {
- err = Pa_IsFormatSupported( inputParameters, outputParameters, standardSampleRates[i] );
- if( err == paFormatIsSupported )
- {
- if( printCount == 0 )
- {
- printf( "\t%8.2f", standardSampleRates[i] );
- printCount = 1;
- }
- else if( printCount == 4 )
- {
- printf( ",\n\t%8.2f", standardSampleRates[i] );
- printCount = 1;
- }
- else
- {
- printf( ", %8.2f", standardSampleRates[i] );
- ++printCount;
- }
- }
- }
- if( !printCount )
- printf( "None\n" );
- else
- printf( "\n" );
-}
-
-/*******************************************************************/
-int main(void);
-int main(void)
-{
- int i, numDevices, defaultDisplayed;
- const PaDeviceInfo *deviceInfo;
- PaStreamParameters inputParameters, outputParameters;
- PaError err;
-
-
- err = Pa_Initialize();
- if( err != paNoError )
- {
- printf( "ERROR: Pa_Initialize returned 0x%x\n", err );
- goto error;
- }
-
- printf( "PortAudio version: 0x%08X\n", Pa_GetVersion());
- printf( "Version text: '%s'\n", Pa_GetVersionInfo()->versionText );
-
- numDevices = Pa_GetDeviceCount();
- if( numDevices < 0 )
- {
- printf( "ERROR: Pa_GetDeviceCount returned 0x%x\n", numDevices );
- err = numDevices;
- goto error;
- }
-
- printf( "Number of devices = %d\n", numDevices );
- for( i=0; i<numDevices; i++ )
- {
- deviceInfo = Pa_GetDeviceInfo( i );
- printf( "--------------------------------------- device #%d\n", i );
-
- /* Mark global and API specific default devices */
- defaultDisplayed = 0;
- if( i == Pa_GetDefaultInputDevice() )
- {
- printf( "[ Default Input" );
- defaultDisplayed = 1;
- }
- else if( i == Pa_GetHostApiInfo( deviceInfo->hostApi )->defaultInputDevice )
- {
- const PaHostApiInfo *hostInfo = Pa_GetHostApiInfo( deviceInfo->hostApi );
- printf( "[ Default %s Input", hostInfo->name );
- defaultDisplayed = 1;
- }
-
- if( i == Pa_GetDefaultOutputDevice() )
- {
- printf( (defaultDisplayed ? "," : "[") );
- printf( " Default Output" );
- defaultDisplayed = 1;
- }
- else if( i == Pa_GetHostApiInfo( deviceInfo->hostApi )->defaultOutputDevice )
- {
- const PaHostApiInfo *hostInfo = Pa_GetHostApiInfo( deviceInfo->hostApi );
- printf( (defaultDisplayed ? "," : "[") );
- printf( " Default %s Output", hostInfo->name );
- defaultDisplayed = 1;
- }
-
- if( defaultDisplayed )
- printf( " ]\n" );
-
- /* print device info fields */
-#ifdef WIN32
- { /* Use wide char on windows, so we can show UTF-8 encoded device names */
- wchar_t wideName[MAX_PATH];
- MultiByteToWideChar(CP_UTF8, 0, deviceInfo->name, -1, wideName, MAX_PATH-1);
- wprintf( L"Name = %s\n", wideName );
- }
-#else
- printf( "Name = %s\n", deviceInfo->name );
-#endif
- printf( "Host API = %s\n", Pa_GetHostApiInfo( deviceInfo->hostApi )->name );
- printf( "Max inputs = %d", deviceInfo->maxInputChannels );
- printf( ", Max outputs = %d\n", deviceInfo->maxOutputChannels );
-
- printf( "Default low input latency = %8.4f\n", deviceInfo->defaultLowInputLatency );
- printf( "Default low output latency = %8.4f\n", deviceInfo->defaultLowOutputLatency );
- printf( "Default high input latency = %8.4f\n", deviceInfo->defaultHighInputLatency );
- printf( "Default high output latency = %8.4f\n", deviceInfo->defaultHighOutputLatency );
-
-#ifdef WIN32
-#if PA_USE_ASIO
-/* ASIO specific latency information */
- if( Pa_GetHostApiInfo( deviceInfo->hostApi )->type == paASIO ){
- long minLatency, maxLatency, preferredLatency, granularity;
-
- err = PaAsio_GetAvailableLatencyValues( i,
- &minLatency, &maxLatency, &preferredLatency, &granularity );
-
- printf( "ASIO minimum buffer size = %ld\n", minLatency );
- printf( "ASIO maximum buffer size = %ld\n", maxLatency );
- printf( "ASIO preferred buffer size = %ld\n", preferredLatency );
-
- if( granularity == -1 )
- printf( "ASIO buffer granularity = power of 2\n" );
- else
- printf( "ASIO buffer granularity = %ld\n", granularity );
- }
-#endif /* PA_USE_ASIO */
-#endif /* WIN32 */
-
- printf( "Default sample rate = %8.2f\n", deviceInfo->defaultSampleRate );
-
- /* poll for standard sample rates */
- inputParameters.device = i;
- inputParameters.channelCount = deviceInfo->maxInputChannels;
- inputParameters.sampleFormat = paInt16;
- inputParameters.suggestedLatency = 0; /* ignored by Pa_IsFormatSupported() */
- inputParameters.hostApiSpecificStreamInfo = NULL;
-
- outputParameters.device = i;
- outputParameters.channelCount = deviceInfo->maxOutputChannels;
- outputParameters.sampleFormat = paInt16;
- outputParameters.suggestedLatency = 0; /* ignored by Pa_IsFormatSupported() */
- outputParameters.hostApiSpecificStreamInfo = NULL;
-
- if( inputParameters.channelCount > 0 )
- {
- printf("Supported standard sample rates\n for half-duplex 16 bit %d channel input = \n",
- inputParameters.channelCount );
- PrintSupportedStandardSampleRates( &inputParameters, NULL );
- }
-
- if( outputParameters.channelCount > 0 )
- {
- printf("Supported standard sample rates\n for half-duplex 16 bit %d channel output = \n",
- outputParameters.channelCount );
- PrintSupportedStandardSampleRates( NULL, &outputParameters );
- }
-
- if( inputParameters.channelCount > 0 && outputParameters.channelCount > 0 )
- {
- printf("Supported standard sample rates\n for full-duplex 16 bit %d channel input, %d channel output = \n",
- inputParameters.channelCount, outputParameters.channelCount );
- PrintSupportedStandardSampleRates( &inputParameters, &outputParameters );
- }
- }
-
- Pa_Terminate();
-
- printf("----------------------------------------------\n");
- return 0;
-
-error:
- Pa_Terminate();
- fprintf( stderr, "Error number: %d\n", err );
- fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
- return err;
-}
diff --git a/portaudio/examples/pa_fuzz.c b/portaudio/examples/pa_fuzz.c
deleted file mode 100644
index 0c24d35..0000000
--- a/portaudio/examples/pa_fuzz.c
+++ /dev/null
@@ -1,183 +0,0 @@
-/** @file pa_fuzz.c
- @ingroup examples_src
- @brief Distort input like a fuzz box.
- @author Phil Burk http://www.softsynth.com
-*/
-/*
- * $Id$
- *
- * This program uses the PortAudio Portable Audio Library.
- * For more information see: http://www.portaudio.com
- * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The text above constitutes the entire PortAudio license; however,
- * the PortAudio community also makes the following non-binding requests:
- *
- * Any person wishing to distribute modifications to the Software is
- * requested to send the modifications to the original developer so that
- * they can be incorporated into the canonical version. It is also
- * requested that these non-binding requests be included along with the
- * license above.
- */
-
-#include <stdio.h>
-#include <math.h>
-#include "portaudio.h"
-/*
-** Note that many of the older ISA sound cards on PCs do NOT support
-** full duplex audio (simultaneous record and playback).
-** And some only support full duplex at lower sample rates.
-*/
-#define SAMPLE_RATE (44100)
-#define PA_SAMPLE_TYPE paFloat32
-#define FRAMES_PER_BUFFER (64)
-
-typedef float SAMPLE;
-
-float CubicAmplifier( float input );
-static int fuzzCallback( const void *inputBuffer, void *outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo* timeInfo,
- PaStreamCallbackFlags statusFlags,
- void *userData );
-
-/* Non-linear amplifier with soft distortion curve. */
-float CubicAmplifier( float input )
-{
- float output, temp;
- if( input < 0.0 )
- {
- temp = input + 1.0f;
- output = (temp * temp * temp) - 1.0f;
- }
- else
- {
- temp = input - 1.0f;
- output = (temp * temp * temp) + 1.0f;
- }
-
- return output;
-}
-#define FUZZ(x) CubicAmplifier(CubicAmplifier(CubicAmplifier(CubicAmplifier(x))))
-
-static int gNumNoInputs = 0;
-/* This routine will be called by the PortAudio engine when audio is needed.
-** It may be called at interrupt level on some machines so don't do anything
-** that could mess up the system like calling malloc() or free().
-*/
-static int fuzzCallback( const void *inputBuffer, void *outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo* timeInfo,
- PaStreamCallbackFlags statusFlags,
- void *userData )
-{
- SAMPLE *out = (SAMPLE*)outputBuffer;
- const SAMPLE *in = (const SAMPLE*)inputBuffer;
- unsigned int i;
- (void) timeInfo; /* Prevent unused variable warnings. */
- (void) statusFlags;
- (void) userData;
-
- if( inputBuffer == NULL )
- {
- for( i=0; i<framesPerBuffer; i++ )
- {
- *out++ = 0; /* left - silent */
- *out++ = 0; /* right - silent */
- }
- gNumNoInputs += 1;
- }
- else
- {
- for( i=0; i<framesPerBuffer; i++ )
- {
- *out++ = FUZZ(*in++); /* left - distorted */
- *out++ = *in++; /* right - clean */
- }
- }
-
- return paContinue;
-}
-
-/*******************************************************************/
-int main(void);
-int main(void)
-{
- PaStreamParameters inputParameters, outputParameters;
- PaStream *stream;
- PaError err;
-
- err = Pa_Initialize();
- if( err != paNoError ) goto error;
-
- inputParameters.device = Pa_GetDefaultInputDevice(); /* default input device */
- if (inputParameters.device == paNoDevice) {
- fprintf(stderr,"Error: No default input device.\n");
- goto error;
- }
- inputParameters.channelCount = 2; /* stereo input */
- inputParameters.sampleFormat = PA_SAMPLE_TYPE;
- inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputParameters.device )->defaultLowInputLatency;
- inputParameters.hostApiSpecificStreamInfo = NULL;
-
- outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */
- if (outputParameters.device == paNoDevice) {
- fprintf(stderr,"Error: No default output device.\n");
- goto error;
- }
- outputParameters.channelCount = 2; /* stereo output */
- outputParameters.sampleFormat = PA_SAMPLE_TYPE;
- outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency;
- outputParameters.hostApiSpecificStreamInfo = NULL;
-
- err = Pa_OpenStream(
- &stream,
- &inputParameters,
- &outputParameters,
- SAMPLE_RATE,
- FRAMES_PER_BUFFER,
- 0, /* paClipOff, */ /* we won't output out of range samples so don't bother clipping them */
- fuzzCallback,
- NULL );
- if( err != paNoError ) goto error;
-
- err = Pa_StartStream( stream );
- if( err != paNoError ) goto error;
-
- printf("Hit ENTER to stop program.\n");
- getchar();
- err = Pa_CloseStream( stream );
- if( err != paNoError ) goto error;
-
- printf("Finished. gNumNoInputs = %d\n", gNumNoInputs );
- Pa_Terminate();
- return 0;
-
-error:
- Pa_Terminate();
- fprintf( stderr, "An error occurred while using the portaudio stream\n" );
- fprintf( stderr, "Error number: %d\n", err );
- fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
- return -1;
-}
diff --git a/portaudio/examples/paex_mono_asio_channel_select.c b/portaudio/examples/paex_mono_asio_channel_select.c
deleted file mode 100644
index 4b55d31..0000000
--- a/portaudio/examples/paex_mono_asio_channel_select.c
+++ /dev/null
@@ -1,167 +0,0 @@
-/** @file paex_mono_asio_channel_select.c
- @ingroup examples_src
- @brief Play a monophonic sine wave on a specific ASIO channel.
- @author Ross Bencina <rossb@audiomulch.com>
- @author Phil Burk <philburk@softsynth.com>
-*/
-/*
- * $Id$
- *
- * Authors:
- * Ross Bencina <rossb@audiomulch.com>
- * Phil Burk <philburk@softsynth.com>
- *
- * This program uses the PortAudio Portable Audio Library.
- * For more information see: http://www.portaudio.com
- * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The text above constitutes the entire PortAudio license; however,
- * the PortAudio community also makes the following non-binding requests:
- *
- * Any person wishing to distribute modifications to the Software is
- * requested to send the modifications to the original developer so that
- * they can be incorporated into the canonical version. It is also
- * requested that these non-binding requests be included along with the
- * license above.
- */
-
-#include <stdio.h>
-#include <math.h>
-#include "portaudio.h"
-#include "pa_asio.h"
-
-#define NUM_SECONDS (10)
-#define SAMPLE_RATE (44100)
-#define AMPLITUDE (0.8)
-#define FRAMES_PER_BUFFER (64)
-#define OUTPUT_DEVICE Pa_GetDefaultOutputDevice()
-
-#ifndef M_PI
-#define M_PI (3.14159265)
-#endif
-
-#define TABLE_SIZE (200)
-typedef struct
-{
- float sine[TABLE_SIZE];
- int phase;
-}
-paTestData;
-
-/* This routine will be called by the PortAudio engine when audio is needed.
-** It may called at interrupt level on some machines so don't do anything
-** that could mess up the system like calling malloc() or free().
-*/
-static int patestCallback( const void *inputBuffer, void *outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo* timeInfo,
- PaStreamCallbackFlags statusFlags,
- void *userData )
-{
- paTestData *data = (paTestData*)userData;
- float *out = (float*)outputBuffer;
- unsigned long i;
- int finished = 0;
- /* avoid unused variable warnings */
- (void) inputBuffer;
- (void) timeInfo;
- (void) statusFlags;
- for( i=0; i<framesPerBuffer; i++ )
- {
- *out++ = data->sine[data->phase]; /* left */
- data->phase += 1;
- if( data->phase >= TABLE_SIZE ) data->phase -= TABLE_SIZE;
- }
- return finished;
-}
-
-/*******************************************************************/
-int main(void);
-int main(void)
-{
- PaStreamParameters outputParameters;
- PaAsioStreamInfo asioOutputInfo;
- PaStream *stream;
- PaError err;
- paTestData data;
- int outputChannelSelectors[1];
- int i;
- printf("PortAudio Test: output MONO sine wave. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER);
- /* initialise sinusoidal wavetable */
- for( i=0; i<TABLE_SIZE; i++ )
- {
- data.sine[i] = (float) (AMPLITUDE * sin( ((double)i/(double)TABLE_SIZE) * M_PI * 2. ));
- }
- data.phase = 0;
-
- err = Pa_Initialize();
- if( err != paNoError ) goto error;
-
- outputParameters.device = OUTPUT_DEVICE;
- outputParameters.channelCount = 1; /* MONO output */
- outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */
- outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency;
-
- /* Use an ASIO specific structure. WARNING - this is not portable. */
- asioOutputInfo.size = sizeof(PaAsioStreamInfo);
- asioOutputInfo.hostApiType = paASIO;
- asioOutputInfo.version = 1;
- asioOutputInfo.flags = paAsioUseChannelSelectors;
- outputChannelSelectors[0] = 1; /* skip channel 0 and use the second (right) ASIO device channel */
- asioOutputInfo.channelSelectors = outputChannelSelectors;
- outputParameters.hostApiSpecificStreamInfo = &asioOutputInfo;
-
- err = Pa_OpenStream(
- &stream,
- NULL, /* no input */
- &outputParameters,
- SAMPLE_RATE,
- FRAMES_PER_BUFFER,
- paClipOff, /* we won't output out of range samples so don't bother clipping them */
- patestCallback,
- &data );
- if( err != paNoError ) goto error;
-
- err = Pa_StartStream( stream );
- if( err != paNoError ) goto error;
-
- printf("Play for %d seconds.\n", NUM_SECONDS ); fflush(stdout);
- Pa_Sleep( NUM_SECONDS * 1000 );
-
- err = Pa_StopStream( stream );
- if( err != paNoError ) goto error;
-
- err = Pa_CloseStream( stream );
- if( err != paNoError ) goto error;
-
- Pa_Terminate();
- printf("Test finished.\n");
- return err;
-error:
- Pa_Terminate();
- fprintf( stderr, "An error occurred while using the portaudio stream\n" );
- fprintf( stderr, "Error number: %d\n", err );
- fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
- return err;
-}
diff --git a/portaudio/examples/paex_ocean_shore.c b/portaudio/examples/paex_ocean_shore.c
deleted file mode 100644
index 9424e8b..0000000
--- a/portaudio/examples/paex_ocean_shore.c
+++ /dev/null
@@ -1,533 +0,0 @@
-/** @file paex_ocean_shore.c
- @ingroup examples_src
- @brief Generate Pink Noise using Gardner method, and make "waves". Provides an example of how to
- post stuff to/from the audio callback using lock-free FIFOs implemented by the PA ringbuffer.
-
- Optimization suggested by James McCartney uses a tree
- to select which random value to replace.
-<pre>
- x x x x x x x x x x x x x x x x
- x x x x x x x x
- x x x x
- x x
- x
-</pre>
- Tree is generated by counting trailing zeros in an increasing index.
- When the index is zero, no random number is selected.
-
- @author Phil Burk http://www.softsynth.com
- Robert Bielik
-*/
-/*
- * $Id$
- *
- * This program uses the PortAudio Portable Audio Library.
- * For more information see: http://www.portaudio.com
- * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The text above constitutes the entire PortAudio license; however,
- * the PortAudio community also makes the following non-binding requests:
- *
- * Any person wishing to distribute modifications to the Software is
- * requested to send the modifications to the original developer so that
- * they can be incorporated into the canonical version. It is also
- * requested that these non-binding requests be included along with the
- * license above.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-#include <time.h>
-
-#include "portaudio.h"
-#include "pa_ringbuffer.h"
-#include "pa_util.h"
-
-#define PINK_MAX_RANDOM_ROWS (30)
-#define PINK_RANDOM_BITS (24)
-#define PINK_RANDOM_SHIFT ((sizeof(long)*8)-PINK_RANDOM_BITS)
-
-typedef struct
-{
- long pink_Rows[PINK_MAX_RANDOM_ROWS];
- long pink_RunningSum; /* Used to optimize summing of generators. */
- int pink_Index; /* Incremented each sample. */
- int pink_IndexMask; /* Index wrapped by ANDing with this mask. */
- float pink_Scalar; /* Used to scale within range of -1.0 to +1.0 */
-}
-PinkNoise;
-
-typedef struct
-{
- float bq_b0;
- float bq_b1;
- float bq_b2;
- float bq_a1;
- float bq_a2;
-} BiQuad;
-
-typedef enum
-{
- State_kAttack,
- State_kPreDecay,
- State_kDecay,
- State_kCnt,
-} EnvState;
-
-typedef struct
-{
- PinkNoise wave_left;
- PinkNoise wave_right;
-
- BiQuad wave_bq_coeffs;
- float wave_bq_left[2];
- float wave_bq_right[2];
-
- EnvState wave_envelope_state;
- float wave_envelope_level;
- float wave_envelope_max_level;
- float wave_pan_left;
- float wave_pan_right;
- float wave_attack_incr;
- float wave_decay_incr;
-
-} OceanWave;
-
-/* Prototypes */
-static unsigned long GenerateRandomNumber( void );
-void InitializePinkNoise( PinkNoise *pink, int numRows );
-float GeneratePinkNoise( PinkNoise *pink );
-unsigned GenerateWave( OceanWave* wave, float* output, unsigned noOfFrames);
-
-/************************************************************/
-/* Calculate pseudo-random 32 bit number based on linear congruential method. */
-static unsigned long GenerateRandomNumber( void )
-{
- /* Change this seed for different random sequences. */
- static unsigned long randSeed = 22222;
- randSeed = (randSeed * 196314165) + 907633515;
- return randSeed;
-}
-
-/************************************************************/
-/* Setup PinkNoise structure for N rows of generators. */
-void InitializePinkNoise( PinkNoise *pink, int numRows )
-{
- int i;
- long pmax;
- pink->pink_Index = 0;
- pink->pink_IndexMask = (1<<numRows) - 1;
- /* Calculate maximum possible signed random value. Extra 1 for white noise always added. */
- pmax = (numRows + 1) * (1<<(PINK_RANDOM_BITS-1));
- pink->pink_Scalar = 1.0f / pmax;
- /* Initialize rows. */
- for( i=0; i<numRows; i++ ) pink->pink_Rows[i] = 0;
- pink->pink_RunningSum = 0;
-}
-
-/* Generate Pink noise values between -1.0 and +1.0 */
-float GeneratePinkNoise( PinkNoise *pink )
-{
- long newRandom;
- long sum;
- float output;
- /* Increment and mask index. */
- pink->pink_Index = (pink->pink_Index + 1) & pink->pink_IndexMask;
- /* If index is zero, don't update any random values. */
- if( pink->pink_Index != 0 )
- {
- /* Determine how many trailing zeros in PinkIndex. */
- /* This algorithm will hang if n==0 so test first. */
- int numZeros = 0;
- int n = pink->pink_Index;
- while( (n & 1) == 0 )
- {
- n = n >> 1;
- numZeros++;
- }
- /* Replace the indexed ROWS random value.
- * Subtract and add back to RunningSum instead of adding all the random
- * values together. Only one changes each time.
- */
- pink->pink_RunningSum -= pink->pink_Rows[numZeros];
- newRandom = ((long)GenerateRandomNumber()) >> PINK_RANDOM_SHIFT;
- pink->pink_RunningSum += newRandom;
- pink->pink_Rows[numZeros] = newRandom;
- }
-
- /* Add extra white noise value. */
- newRandom = ((long)GenerateRandomNumber()) >> PINK_RANDOM_SHIFT;
- sum = pink->pink_RunningSum + newRandom;
- /* Scale to range of -1.0 to 0.9999. */
- output = pink->pink_Scalar * sum;
- return output;
-}
-
-float ProcessBiquad(const BiQuad* coeffs, float* memory, float input)
-{
- float w = input - coeffs->bq_a1 * memory[0] - coeffs->bq_a2 * memory[1];
- float out = coeffs->bq_b1 * memory[0] + coeffs->bq_b2 * memory[1] + coeffs->bq_b0 * w;
- memory[1] = memory[0];
- memory[0] = w;
- return out;
-}
-
-static const float one_over_2Q_LP = 0.3f;
-static const float one_over_2Q_HP = 1.0f;
-
-unsigned GenerateWave( OceanWave* wave, float* output, unsigned noOfFrames )
-{
- unsigned retval=0,i;
- float targetLevel, levelIncr, currentLevel;
- switch (wave->wave_envelope_state)
- {
- case State_kAttack:
- targetLevel = noOfFrames * wave->wave_attack_incr + wave->wave_envelope_level;
- if (targetLevel >= wave->wave_envelope_max_level)
- {
- /* Go to decay state */
- wave->wave_envelope_state = State_kPreDecay;
- targetLevel = wave->wave_envelope_max_level;
- }
- /* Calculate lowpass biquad coeffs
-
- alpha = sin(w0)/(2*Q)
-
- b0 = (1 - cos(w0))/2
- b1 = 1 - cos(w0)
- b2 = (1 - cos(w0))/2
- a0 = 1 + alpha
- a1 = -2*cos(w0)
- a2 = 1 - alpha
-
- w0 = [0 - pi[
- */
- {
- const float w0 = 3.141592654f * targetLevel / wave->wave_envelope_max_level;
- const float alpha = sinf(w0) * one_over_2Q_LP;
- const float cosw0 = cosf(w0);
- const float a0_fact = 1.0f / (1.0f + alpha);
- wave->wave_bq_coeffs.bq_b1 = (1.0f - cosw0) * a0_fact;
- wave->wave_bq_coeffs.bq_b0 = wave->wave_bq_coeffs.bq_b1 * 0.5f;
- wave->wave_bq_coeffs.bq_b2 = wave->wave_bq_coeffs.bq_b0;
- wave->wave_bq_coeffs.bq_a2 = (1.0f - alpha) * a0_fact;
- wave->wave_bq_coeffs.bq_a1 = -2.0f * cosw0 * a0_fact;
- }
- break;
-
- case State_kPreDecay:
- /* Reset biquad state */
- memset(wave->wave_bq_left, 0, 2 * sizeof(float));
- memset(wave->wave_bq_right, 0, 2 * sizeof(float));
- wave->wave_envelope_state = State_kDecay;
-
- /* Deliberate fall-through */
-
- case State_kDecay:
- targetLevel = noOfFrames * wave->wave_decay_incr + wave->wave_envelope_level;
- if (targetLevel < 0.001f)
- {
- /* < -60 dB, we're done */
- wave->wave_envelope_state = 3;
- retval = 1;
- }
- /* Calculate highpass biquad coeffs
-
- alpha = sin(w0)/(2*Q)
-
- b0 = (1 + cos(w0))/2
- b1 = -(1 + cos(w0))
- b2 = (1 + cos(w0))/2
- a0 = 1 + alpha
- a1 = -2*cos(w0)
- a2 = 1 - alpha
-
- w0 = [0 - pi/2[
- */
- {
- const float v = targetLevel / wave->wave_envelope_max_level;
- const float w0 = 1.5707963f * (1.0f - (v*v));
- const float alpha = sinf(w0) * one_over_2Q_HP;
- const float cosw0 = cosf(w0);
- const float a0_fact = 1.0f / (1.0f + alpha);
- wave->wave_bq_coeffs.bq_b1 = (float)(- (1 + cosw0) * a0_fact);
- wave->wave_bq_coeffs.bq_b0 = -wave->wave_bq_coeffs.bq_b1 * 0.5f;
- wave->wave_bq_coeffs.bq_b2 = wave->wave_bq_coeffs.bq_b0;
- wave->wave_bq_coeffs.bq_a2 = (float)((1.0 - alpha) * a0_fact);
- wave->wave_bq_coeffs.bq_a1 = (float)(-2.0 * cosw0 * a0_fact);
- }
- break;
-
- default:
- break;
- }
-
- currentLevel = wave->wave_envelope_level;
- wave->wave_envelope_level = targetLevel;
- levelIncr = (targetLevel - currentLevel) / noOfFrames;
-
- for (i = 0; i < noOfFrames; ++i, currentLevel += levelIncr)
- {
- (*output++) += ProcessBiquad(&wave->wave_bq_coeffs, wave->wave_bq_left, (GeneratePinkNoise(&wave->wave_left))) * currentLevel * wave->wave_pan_left;
- (*output++) += ProcessBiquad(&wave->wave_bq_coeffs, wave->wave_bq_right, (GeneratePinkNoise(&wave->wave_right))) * currentLevel * wave->wave_pan_right;
- }
-
- return retval;
-}
-
-
-/*******************************************************************/
-
-/* Context for callback routine. */
-typedef struct
-{
- OceanWave* waves[16]; /* Maximum 16 waves */
- unsigned noOfActiveWaves;
-
- /* Ring buffer (FIFO) for "communicating" towards audio callback */
- PaUtilRingBuffer rBufToRT;
- void* rBufToRTData;
-
- /* Ring buffer (FIFO) for "communicating" from audio callback */
- PaUtilRingBuffer rBufFromRT;
- void* rBufFromRTData;
-}
-paTestData;
-
-/* This routine will be called by the PortAudio engine when audio is needed.
-** It may called at interrupt level on some machines so don't do anything
-** that could mess up the system like calling malloc() or free().
-*/
-static int patestCallback(const void* inputBuffer,
- void* outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo* timeInfo,
- PaStreamCallbackFlags statusFlags,
- void* userData)
-{
- int i;
- paTestData *data = (paTestData*)userData;
- float *out = (float*)outputBuffer;
- (void) inputBuffer; /* Prevent "unused variable" warnings. */
-
- /* Reset output data first */
- memset(out, 0, framesPerBuffer * 2 * sizeof(float));
-
- for (i = 0; i < 16; ++i)
- {
- /* Consume the input queue */
- if (data->waves[i] == 0 && PaUtil_GetRingBufferReadAvailable(&data->rBufToRT))
- {
- OceanWave* ptr = 0;
- PaUtil_ReadRingBuffer(&data->rBufToRT, &ptr, 1);
- data->waves[i] = ptr;
- }
-
- if (data->waves[i] != 0)
- {
- if (GenerateWave(data->waves[i], out, framesPerBuffer))
- {
- /* If wave is "done", post it back to the main thread for deletion */
- PaUtil_WriteRingBuffer(&data->rBufFromRT, &data->waves[i], 1);
- data->waves[i] = 0;
- }
- }
- }
- return paContinue;
-}
-
-#define NEW_ROW_SIZE (12 + (8*rand())/RAND_MAX)
-
-OceanWave* InitializeWave(double SR, float attackInSeconds, float maxLevel, float positionLeftRight)
-{
- OceanWave* wave = NULL;
- static unsigned lastNoOfRows = 12;
- unsigned newNoOfRows;
-
- wave = (OceanWave*)PaUtil_AllocateMemory(sizeof(OceanWave));
- if (wave != NULL)
- {
- InitializePinkNoise(&wave->wave_left, lastNoOfRows);
- while ((newNoOfRows = NEW_ROW_SIZE) == lastNoOfRows);
- InitializePinkNoise(&wave->wave_right, newNoOfRows);
- lastNoOfRows = newNoOfRows;
-
- wave->wave_envelope_state = State_kAttack;
- wave->wave_envelope_level = 0.f;
- wave->wave_envelope_max_level = maxLevel;
- wave->wave_attack_incr = wave->wave_envelope_max_level / (attackInSeconds * (float)SR);
- wave->wave_decay_incr = - wave->wave_envelope_max_level / (attackInSeconds * 4 * (float)SR);
-
- wave->wave_pan_left = sqrtf(1.0f - positionLeftRight);
- wave->wave_pan_right = sqrtf(positionLeftRight);
- }
- return wave;
-}
-
-static float GenerateFloatRandom(float minValue, float maxValue)
-{
- return minValue + ((maxValue - minValue) * rand()) / RAND_MAX;
-}
-
-/*******************************************************************/
-int main(void);
-int main(void)
-{
- PaStream* stream;
- PaError err;
- paTestData data = {0};
- PaStreamParameters outputParameters;
- double tstamp;
- double tstart;
- double tdelta = 0;
- static const double SR = 44100.0;
- static const int FPB = 128; /* Frames per buffer: 2.9 ms buffers. */
-
- /* Initialize communication buffers (queues) */
- data.rBufToRTData = PaUtil_AllocateMemory(sizeof(OceanWave*) * 256);
- if (data.rBufToRTData == NULL)
- {
- return 1;
- }
- PaUtil_InitializeRingBuffer(&data.rBufToRT, sizeof(OceanWave*), 256, data.rBufToRTData);
-
- data.rBufFromRTData = PaUtil_AllocateMemory(sizeof(OceanWave*) * 256);
- if (data.rBufFromRTData == NULL)
- {
- return 1;
- }
- PaUtil_InitializeRingBuffer(&data.rBufFromRT, sizeof(OceanWave*), 256, data.rBufFromRTData);
-
- err = Pa_Initialize();
- if( err != paNoError ) goto error;
-
- /* Open a stereo PortAudio stream so we can hear the result. */
- outputParameters.device = Pa_GetDefaultOutputDevice(); /* Take the default output device. */
- if (outputParameters.device == paNoDevice) {
- fprintf(stderr,"Error: No default output device.\n");
- goto error;
- }
- outputParameters.channelCount = 2; /* Stereo output, most likely supported. */
- outputParameters.hostApiSpecificStreamInfo = NULL;
- outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output. */
- outputParameters.suggestedLatency = Pa_GetDeviceInfo(outputParameters.device)->defaultLowOutputLatency;
- err = Pa_OpenStream(&stream,
- NULL, /* No input. */
- &outputParameters,
- SR, /* Sample rate. */
- FPB, /* Frames per buffer. */
- paDitherOff, /* Clip but don't dither */
- patestCallback,
- &data);
- if( err != paNoError ) goto error;
-
- err = Pa_StartStream( stream );
- if( err != paNoError ) goto error;
-
- printf("Stereo \"ocean waves\" for one minute...\n");
-
- tstart = PaUtil_GetTime();
- tstamp = tstart;
- srand( (unsigned)time(NULL) );
-
- while( ( err = Pa_IsStreamActive( stream ) ) == 1 )
- {
- const double tcurrent = PaUtil_GetTime();
-
- /* Delete "waves" that the callback is finished with */
- while (PaUtil_GetRingBufferReadAvailable(&data.rBufFromRT) > 0)
- {
- OceanWave* ptr = 0;
- PaUtil_ReadRingBuffer(&data.rBufFromRT, &ptr, 1);
- if (ptr != 0)
- {
- printf("Wave is deleted...\n");
- PaUtil_FreeMemory(ptr);
- --data.noOfActiveWaves;
- }
- }
-
- if (tcurrent - tstart < 60.0) /* Only start new "waves" during one minute */
- {
- if (tcurrent >= tstamp)
- {
- double tdelta = GenerateFloatRandom(1.0f, 4.0f);
- tstamp += tdelta;
-
- if (data.noOfActiveWaves<16)
- {
- const float attackTime = GenerateFloatRandom(2.0f, 6.0f);
- const float level = GenerateFloatRandom(0.1f, 1.0f);
- const float pos = GenerateFloatRandom(0.0f, 1.0f);
- OceanWave* p = InitializeWave(SR, attackTime, level, pos);
- if (p != NULL)
- {
- /* Post wave to audio callback */
- PaUtil_WriteRingBuffer(&data.rBufToRT, &p, 1);
- ++data.noOfActiveWaves;
-
- printf("Starting wave at level = %.2f, attack = %.2lf, pos = %.2lf\n", level, attackTime, pos);
- }
- }
- }
- }
- else
- {
- if (data.noOfActiveWaves == 0)
- {
- printf("All waves finished!\n");
- break;
- }
- }
-
- Pa_Sleep(100);
- }
- if( err < 0 ) goto error;
-
- err = Pa_CloseStream( stream );
- if( err != paNoError ) goto error;
-
- if (data.rBufToRTData)
- {
- PaUtil_FreeMemory(data.rBufToRTData);
- }
- if (data.rBufFromRTData)
- {
- PaUtil_FreeMemory(data.rBufFromRTData);
- }
-
- Pa_Sleep(1000);
-
- Pa_Terminate();
- return 0;
-
-error:
- Pa_Terminate();
- fprintf( stderr, "An error occurred while using the portaudio stream\n" );
- fprintf( stderr, "Error number: %d\n", err );
- fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
- return 0;
-}
diff --git a/portaudio/examples/paex_pink.c b/portaudio/examples/paex_pink.c
deleted file mode 100644
index 519f979..0000000
--- a/portaudio/examples/paex_pink.c
+++ /dev/null
@@ -1,280 +0,0 @@
-/** @file paex_pink.c
- @ingroup examples_src
- @brief Generate Pink Noise using Gardner method.
-
- Optimization suggested by James McCartney uses a tree
- to select which random value to replace.
-<pre>
- x x x x x x x x x x x x x x x x
- x x x x x x x x
- x x x x
- x x
- x
-</pre>
- Tree is generated by counting trailing zeros in an increasing index.
- When the index is zero, no random number is selected.
-
- @author Phil Burk http://www.softsynth.com
-*/
-/*
- * $Id$
- *
- * This program uses the PortAudio Portable Audio Library.
- * For more information see: http://www.portaudio.com
- * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The text above constitutes the entire PortAudio license; however,
- * the PortAudio community also makes the following non-binding requests:
- *
- * Any person wishing to distribute modifications to the Software is
- * requested to send the modifications to the original developer so that
- * they can be incorporated into the canonical version. It is also
- * requested that these non-binding requests be included along with the
- * license above.
- */
-
-#include <stdio.h>
-#include <math.h>
-#include "portaudio.h"
-
-#define PINK_MAX_RANDOM_ROWS (30)
-#define PINK_RANDOM_BITS (24)
-#define PINK_RANDOM_SHIFT ((sizeof(long)*8)-PINK_RANDOM_BITS)
-
-typedef struct
-{
- long pink_Rows[PINK_MAX_RANDOM_ROWS];
- long pink_RunningSum; /* Used to optimize summing of generators. */
- int pink_Index; /* Incremented each sample. */
- int pink_IndexMask; /* Index wrapped by ANDing with this mask. */
- float pink_Scalar; /* Used to scale within range of -1.0 to +1.0 */
-}
-PinkNoise;
-
-/* Prototypes */
-static unsigned long GenerateRandomNumber( void );
-void InitializePinkNoise( PinkNoise *pink, int numRows );
-float GeneratePinkNoise( PinkNoise *pink );
-
-/************************************************************/
-/* Calculate pseudo-random 32 bit number based on linear congruential method. */
-static unsigned long GenerateRandomNumber( void )
-{
- /* Change this seed for different random sequences. */
- static unsigned long randSeed = 22222;
- randSeed = (randSeed * 196314165) + 907633515;
- return randSeed;
-}
-
-/************************************************************/
-/* Setup PinkNoise structure for N rows of generators. */
-void InitializePinkNoise( PinkNoise *pink, int numRows )
-{
- int i;
- long pmax;
- pink->pink_Index = 0;
- pink->pink_IndexMask = (1<<numRows) - 1;
- /* Calculate maximum possible signed random value. Extra 1 for white noise always added. */
- pmax = (numRows + 1) * (1<<(PINK_RANDOM_BITS-1));
- pink->pink_Scalar = 1.0f / pmax;
- /* Initialize rows. */
- for( i=0; i<numRows; i++ ) pink->pink_Rows[i] = 0;
- pink->pink_RunningSum = 0;
-}
-
-#define PINK_MEASURE
-#ifdef PINK_MEASURE
-float pinkMax = -999.0;
-float pinkMin = 999.0;
-#endif
-
-/* Generate Pink noise values between -1.0 and +1.0 */
-float GeneratePinkNoise( PinkNoise *pink )
-{
- long newRandom;
- long sum;
- float output;
- /* Increment and mask index. */
- pink->pink_Index = (pink->pink_Index + 1) & pink->pink_IndexMask;
- /* If index is zero, don't update any random values. */
- if( pink->pink_Index != 0 )
- {
- /* Determine how many trailing zeros in PinkIndex. */
- /* This algorithm will hang if n==0 so test first. */
- int numZeros = 0;
- int n = pink->pink_Index;
- while( (n & 1) == 0 )
- {
- n = n >> 1;
- numZeros++;
- }
- /* Replace the indexed ROWS random value.
- * Subtract and add back to RunningSum instead of adding all the random
- * values together. Only one changes each time.
- */
- pink->pink_RunningSum -= pink->pink_Rows[numZeros];
- newRandom = ((long)GenerateRandomNumber()) >> PINK_RANDOM_SHIFT;
- pink->pink_RunningSum += newRandom;
- pink->pink_Rows[numZeros] = newRandom;
- }
-
- /* Add extra white noise value. */
- newRandom = ((long)GenerateRandomNumber()) >> PINK_RANDOM_SHIFT;
- sum = pink->pink_RunningSum + newRandom;
- /* Scale to range of -1.0 to 0.9999. */
- output = pink->pink_Scalar * sum;
-#ifdef PINK_MEASURE
- /* Check Min/Max */
- if( output > pinkMax ) pinkMax = output;
- else if( output < pinkMin ) pinkMin = output;
-#endif
- return output;
-}
-
-/*******************************************************************/
-#define PINK_TEST
-#ifdef PINK_TEST
-
-/* Context for callback routine. */
-typedef struct
-{
- PinkNoise leftPink;
- PinkNoise rightPink;
- unsigned int sampsToGo;
-}
-paTestData;
-
-/* This routine will be called by the PortAudio engine when audio is needed.
-** It may called at interrupt level on some machines so don't do anything
-** that could mess up the system like calling malloc() or free().
-*/
-static int patestCallback(const void* inputBuffer,
- void* outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo* timeInfo,
- PaStreamCallbackFlags statusFlags,
- void* userData)
-{
- int finished;
- int i;
- int numFrames;
- paTestData *data = (paTestData*)userData;
- float *out = (float*)outputBuffer;
- (void) inputBuffer; /* Prevent "unused variable" warnings. */
-
- /* Are we almost at end. */
- if( data->sampsToGo < framesPerBuffer )
- {
- numFrames = data->sampsToGo;
- finished = 1;
- }
- else
- {
- numFrames = framesPerBuffer;
- finished = 0;
- }
- for( i=0; i<numFrames; i++ )
- {
- *out++ = GeneratePinkNoise( &data->leftPink );
- *out++ = GeneratePinkNoise( &data->rightPink );
- }
- data->sampsToGo -= numFrames;
- return finished;
-}
-
-/*******************************************************************/
-int main(void);
-int main(void)
-{
- PaStream* stream;
- PaError err;
- paTestData data;
- PaStreamParameters outputParameters;
- int totalSamps;
- static const double SR = 44100.0;
- static const int FPB = 2048; /* Frames per buffer: 46 ms buffers. */
-
- /* Initialize two pink noise signals with different numbers of rows. */
- InitializePinkNoise( &data.leftPink, 12 );
- InitializePinkNoise( &data.rightPink, 16 );
-
- /* Look at a few values. */
- {
- int i;
- float pink;
- for( i=0; i<20; i++ )
- {
- pink = GeneratePinkNoise( &data.leftPink );
- printf("Pink = %f\n", pink );
- }
- }
-
- data.sampsToGo = totalSamps = (int)(60.0 * SR); /* Play a whole minute. */
- err = Pa_Initialize();
- if( err != paNoError ) goto error;
-
- /* Open a stereo PortAudio stream so we can hear the result. */
- outputParameters.device = Pa_GetDefaultOutputDevice(); /* Take the default output device. */
- if (outputParameters.device == paNoDevice) {
- fprintf(stderr,"Error: No default output device.\n");
- goto error;
- }
- outputParameters.channelCount = 2; /* Stereo output, most likely supported. */
- outputParameters.hostApiSpecificStreamInfo = NULL;
- outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output. */
- outputParameters.suggestedLatency =
- Pa_GetDeviceInfo(outputParameters.device)->defaultLowOutputLatency;
- err = Pa_OpenStream(&stream,
- NULL, /* No input. */
- &outputParameters,
- SR, /* Sample rate. */
- FPB, /* Frames per buffer. */
- paClipOff, /* we won't output out of range samples so don't bother clipping them */
- patestCallback,
- &data);
- if( err != paNoError ) goto error;
-
- err = Pa_StartStream( stream );
- if( err != paNoError ) goto error;
-
- printf("Stereo pink noise for one minute...\n");
-
- while( ( err = Pa_IsStreamActive( stream ) ) == 1 ) Pa_Sleep(100);
- if( err < 0 ) goto error;
-
- err = Pa_CloseStream( stream );
- if( err != paNoError ) goto error;
-#ifdef PINK_MEASURE
- printf("Pink min = %f, max = %f\n", pinkMin, pinkMax );
-#endif
- Pa_Terminate();
- return 0;
-error:
- Pa_Terminate();
- fprintf( stderr, "An error occurred while using the portaudio stream\n" );
- fprintf( stderr, "Error number: %d\n", err );
- fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
- return 0;
-}
-#endif /* PINK_TEST */
diff --git a/portaudio/examples/paex_read_write_wire.c b/portaudio/examples/paex_read_write_wire.c
deleted file mode 100644
index b5046af..0000000
--- a/portaudio/examples/paex_read_write_wire.c
+++ /dev/null
@@ -1,204 +0,0 @@
-/** @file paex_read_write_wire.c
- @ingroup examples_src
- @brief Tests full duplex blocking I/O by passing input straight to output.
- @author Bjorn Roche. XO Audio LLC for Z-Systems Engineering.
- @author based on code by: Phil Burk http://www.softsynth.com
- @author based on code by: Ross Bencina rossb@audiomulch.com
-*/
-/*
- * $Id: patest_read_record.c 757 2004-02-13 07:48:10Z rossbencina $
- *
- * This program uses the PortAudio Portable Audio Library.
- * For more information see: http://www.portaudio.com
- * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The text above constitutes the entire PortAudio license; however,
- * the PortAudio community also makes the following non-binding requests:
- *
- * Any person wishing to distribute modifications to the Software is
- * requested to send the modifications to the original developer so that
- * they can be incorporated into the canonical version. It is also
- * requested that these non-binding requests be included along with the
- * license above.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "portaudio.h"
-
-/* #define SAMPLE_RATE (17932) // Test failure to open with this value. */
-#define SAMPLE_RATE (44100)
-#define FRAMES_PER_BUFFER (512)
-#define NUM_SECONDS (10)
-/* #define DITHER_FLAG (paDitherOff) */
-#define DITHER_FLAG (0)
-
-/* Select sample format. */
-#if 1
-#define PA_SAMPLE_TYPE paFloat32
-#define SAMPLE_SIZE (4)
-#define SAMPLE_SILENCE (0.0f)
-#define PRINTF_S_FORMAT "%.8f"
-#elif 0
-#define PA_SAMPLE_TYPE paInt16
-#define SAMPLE_SIZE (2)
-#define SAMPLE_SILENCE (0)
-#define PRINTF_S_FORMAT "%d"
-#elif 0
-#define PA_SAMPLE_TYPE paInt24
-#define SAMPLE_SIZE (3)
-#define SAMPLE_SILENCE (0)
-#define PRINTF_S_FORMAT "%d"
-#elif 0
-#define PA_SAMPLE_TYPE paInt8
-#define SAMPLE_SIZE (1)
-#define SAMPLE_SILENCE (0)
-#define PRINTF_S_FORMAT "%d"
-#else
-#define PA_SAMPLE_TYPE paUInt8
-#define SAMPLE_SIZE (1)
-#define SAMPLE_SILENCE (128)
-#define PRINTF_S_FORMAT "%d"
-#endif
-
-/*******************************************************************/
-int main(void);
-int main(void)
-{
- PaStreamParameters inputParameters, outputParameters;
- PaStream *stream = NULL;
- PaError err;
- const PaDeviceInfo* inputInfo;
- const PaDeviceInfo* outputInfo;
- char *sampleBlock = NULL;
- int i;
- int numBytes;
- int numChannels;
-
- printf("patest_read_write_wire.c\n"); fflush(stdout);
- printf("sizeof(int) = %lu\n", sizeof(int)); fflush(stdout);
- printf("sizeof(long) = %lu\n", sizeof(long)); fflush(stdout);
-
- err = Pa_Initialize();
- if( err != paNoError ) goto error2;
-
- inputParameters.device = Pa_GetDefaultInputDevice(); /* default input device */
- printf( "Input device # %d.\n", inputParameters.device );
- inputInfo = Pa_GetDeviceInfo( inputParameters.device );
- printf( " Name: %s\n", inputInfo->name );
- printf( " LL: %g s\n", inputInfo->defaultLowInputLatency );
- printf( " HL: %g s\n", inputInfo->defaultHighInputLatency );
-
- outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */
- printf( "Output device # %d.\n", outputParameters.device );
- outputInfo = Pa_GetDeviceInfo( outputParameters.device );
- printf( " Name: %s\n", outputInfo->name );
- printf( " LL: %g s\n", outputInfo->defaultLowOutputLatency );
- printf( " HL: %g s\n", outputInfo->defaultHighOutputLatency );
-
- numChannels = inputInfo->maxInputChannels < outputInfo->maxOutputChannels
- ? inputInfo->maxInputChannels : outputInfo->maxOutputChannels;
- printf( "Num channels = %d.\n", numChannels );
-
- inputParameters.channelCount = numChannels;
- inputParameters.sampleFormat = PA_SAMPLE_TYPE;
- inputParameters.suggestedLatency = inputInfo->defaultHighInputLatency ;
- inputParameters.hostApiSpecificStreamInfo = NULL;
-
- outputParameters.channelCount = numChannels;
- outputParameters.sampleFormat = PA_SAMPLE_TYPE;
- outputParameters.suggestedLatency = outputInfo->defaultHighOutputLatency;
- outputParameters.hostApiSpecificStreamInfo = NULL;
-
- /* -- setup -- */
-
- err = Pa_OpenStream(
- &stream,
- &inputParameters,
- &outputParameters,
- SAMPLE_RATE,
- FRAMES_PER_BUFFER,
- paClipOff, /* we won't output out of range samples so don't bother clipping them */
- NULL, /* no callback, use blocking API */
- NULL ); /* no callback, so no callback userData */
- if( err != paNoError ) goto error2;
-
- numBytes = FRAMES_PER_BUFFER * numChannels * SAMPLE_SIZE ;
- sampleBlock = (char *) malloc( numBytes );
- if( sampleBlock == NULL )
- {
- printf("Could not allocate record array.\n");
- goto error1;
- }
- memset( sampleBlock, SAMPLE_SILENCE, numBytes );
-
- err = Pa_StartStream( stream );
- if( err != paNoError ) goto error1;
- printf("Wire on. Will run %d seconds.\n", NUM_SECONDS); fflush(stdout);
-
- for( i=0; i<(NUM_SECONDS*SAMPLE_RATE)/FRAMES_PER_BUFFER; ++i )
- {
- // You may get underruns or overruns if the output is not primed by PortAudio.
- err = Pa_WriteStream( stream, sampleBlock, FRAMES_PER_BUFFER );
- if( err ) goto xrun;
- err = Pa_ReadStream( stream, sampleBlock, FRAMES_PER_BUFFER );
- if( err ) goto xrun;
- }
- printf("Wire off.\n"); fflush(stdout);
-
- err = Pa_StopStream( stream );
- if( err != paNoError ) goto error1;
-
- free( sampleBlock );
-
- Pa_Terminate();
- return 0;
-
-xrun:
- printf("err = %d\n", err); fflush(stdout);
- if( stream ) {
- Pa_AbortStream( stream );
- Pa_CloseStream( stream );
- }
- free( sampleBlock );
- Pa_Terminate();
- if( err & paInputOverflow )
- fprintf( stderr, "Input Overflow.\n" );
- if( err & paOutputUnderflow )
- fprintf( stderr, "Output Underflow.\n" );
- return -2;
-error1:
- free( sampleBlock );
-error2:
- if( stream ) {
- Pa_AbortStream( stream );
- Pa_CloseStream( stream );
- }
- Pa_Terminate();
- fprintf( stderr, "An error occurred while using the portaudio stream\n" );
- fprintf( stderr, "Error number: %d\n", err );
- fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
- return -1;
-}
diff --git a/portaudio/examples/paex_record.c b/portaudio/examples/paex_record.c
deleted file mode 100644
index 53bf571..0000000
--- a/portaudio/examples/paex_record.c
+++ /dev/null
@@ -1,353 +0,0 @@
-/** @file paex_record.c
- @ingroup examples_src
- @brief Record input into an array; Save array to a file; Playback recorded data.
- @author Phil Burk http://www.softsynth.com
-*/
-/*
- * $Id$
- *
- * This program uses the PortAudio Portable Audio Library.
- * For more information see: http://www.portaudio.com
- * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The text above constitutes the entire PortAudio license; however,
- * the PortAudio community also makes the following non-binding requests:
- *
- * Any person wishing to distribute modifications to the Software is
- * requested to send the modifications to the original developer so that
- * they can be incorporated into the canonical version. It is also
- * requested that these non-binding requests be included along with the
- * license above.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include "portaudio.h"
-
-/* #define SAMPLE_RATE (17932) // Test failure to open with this value. */
-#define SAMPLE_RATE (44100)
-#define FRAMES_PER_BUFFER (512)
-#define NUM_SECONDS (5)
-#define NUM_CHANNELS (2)
-/* #define DITHER_FLAG (paDitherOff) */
-#define DITHER_FLAG (0) /**/
-/** Set to 1 if you want to capture the recording to a file. */
-#define WRITE_TO_FILE (0)
-
-/* Select sample format. */
-#if 1
-#define PA_SAMPLE_TYPE paFloat32
-typedef float SAMPLE;
-#define SAMPLE_SILENCE (0.0f)
-#define PRINTF_S_FORMAT "%.8f"
-#elif 1
-#define PA_SAMPLE_TYPE paInt16
-typedef short SAMPLE;
-#define SAMPLE_SILENCE (0)
-#define PRINTF_S_FORMAT "%d"
-#elif 0
-#define PA_SAMPLE_TYPE paInt8
-typedef char SAMPLE;
-#define SAMPLE_SILENCE (0)
-#define PRINTF_S_FORMAT "%d"
-#else
-#define PA_SAMPLE_TYPE paUInt8
-typedef unsigned char SAMPLE;
-#define SAMPLE_SILENCE (128)
-#define PRINTF_S_FORMAT "%d"
-#endif
-
-typedef struct
-{
- int frameIndex; /* Index into sample array. */
- int maxFrameIndex;
- SAMPLE *recordedSamples;
-}
-paTestData;
-
-/* This routine will be called by the PortAudio engine when audio is needed.
-** It may be called at interrupt level on some machines so don't do anything
-** that could mess up the system like calling malloc() or free().
-*/
-static int recordCallback( const void *inputBuffer, void *outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo* timeInfo,
- PaStreamCallbackFlags statusFlags,
- void *userData )
-{
- paTestData *data = (paTestData*)userData;
- const SAMPLE *rptr = (const SAMPLE*)inputBuffer;
- SAMPLE *wptr = &data->recordedSamples[data->frameIndex * NUM_CHANNELS];
- long framesToCalc;
- long i;
- int finished;
- unsigned long framesLeft = data->maxFrameIndex - data->frameIndex;
-
- (void) outputBuffer; /* Prevent unused variable warnings. */
- (void) timeInfo;
- (void) statusFlags;
- (void) userData;
-
- if( framesLeft < framesPerBuffer )
- {
- framesToCalc = framesLeft;
- finished = paComplete;
- }
- else
- {
- framesToCalc = framesPerBuffer;
- finished = paContinue;
- }
-
- if( inputBuffer == NULL )
- {
- for( i=0; i<framesToCalc; i++ )
- {
- *wptr++ = SAMPLE_SILENCE; /* left */
- if( NUM_CHANNELS == 2 ) *wptr++ = SAMPLE_SILENCE; /* right */
- }
- }
- else
- {
- for( i=0; i<framesToCalc; i++ )
- {
- *wptr++ = *rptr++; /* left */
- if( NUM_CHANNELS == 2 ) *wptr++ = *rptr++; /* right */
- }
- }
- data->frameIndex += framesToCalc;
- return finished;
-}
-
-/* This routine will be called by the PortAudio engine when audio is needed.
-** It may be called at interrupt level on some machines so don't do anything
-** that could mess up the system like calling malloc() or free().
-*/
-static int playCallback( const void *inputBuffer, void *outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo* timeInfo,
- PaStreamCallbackFlags statusFlags,
- void *userData )
-{
- paTestData *data = (paTestData*)userData;
- SAMPLE *rptr = &data->recordedSamples[data->frameIndex * NUM_CHANNELS];
- SAMPLE *wptr = (SAMPLE*)outputBuffer;
- unsigned int i;
- int finished;
- unsigned int framesLeft = data->maxFrameIndex - data->frameIndex;
-
- (void) inputBuffer; /* Prevent unused variable warnings. */
- (void) timeInfo;
- (void) statusFlags;
- (void) userData;
-
- if( framesLeft < framesPerBuffer )
- {
- /* final buffer... */
- for( i=0; i<framesLeft; i++ )
- {
- *wptr++ = *rptr++; /* left */
- if( NUM_CHANNELS == 2 ) *wptr++ = *rptr++; /* right */
- }
- for( ; i<framesPerBuffer; i++ )
- {
- *wptr++ = 0; /* left */
- if( NUM_CHANNELS == 2 ) *wptr++ = 0; /* right */
- }
- data->frameIndex += framesLeft;
- finished = paComplete;
- }
- else
- {
- for( i=0; i<framesPerBuffer; i++ )
- {
- *wptr++ = *rptr++; /* left */
- if( NUM_CHANNELS == 2 ) *wptr++ = *rptr++; /* right */
- }
- data->frameIndex += framesPerBuffer;
- finished = paContinue;
- }
- return finished;
-}
-
-/*******************************************************************/
-int main(void);
-int main(void)
-{
- PaStreamParameters inputParameters,
- outputParameters;
- PaStream* stream;
- PaError err = paNoError;
- paTestData data;
- int i;
- int totalFrames;
- int numSamples;
- int numBytes;
- SAMPLE max, val;
- double average;
-
- printf("patest_record.c\n"); fflush(stdout);
-
- data.maxFrameIndex = totalFrames = NUM_SECONDS * SAMPLE_RATE; /* Record for a few seconds. */
- data.frameIndex = 0;
- numSamples = totalFrames * NUM_CHANNELS;
- numBytes = numSamples * sizeof(SAMPLE);
- data.recordedSamples = (SAMPLE *) malloc( numBytes ); /* From now on, recordedSamples is initialised. */
- if( data.recordedSamples == NULL )
- {
- printf("Could not allocate record array.\n");
- goto done;
- }
- for( i=0; i<numSamples; i++ ) data.recordedSamples[i] = 0;
-
- err = Pa_Initialize();
- if( err != paNoError ) goto done;
-
- inputParameters.device = Pa_GetDefaultInputDevice(); /* default input device */
- if (inputParameters.device == paNoDevice) {
- fprintf(stderr,"Error: No default input device.\n");
- goto done;
- }
- inputParameters.channelCount = 2; /* stereo input */
- inputParameters.sampleFormat = PA_SAMPLE_TYPE;
- inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputParameters.device )->defaultLowInputLatency;
- inputParameters.hostApiSpecificStreamInfo = NULL;
-
- /* Record some audio. -------------------------------------------- */
- err = Pa_OpenStream(
- &stream,
- &inputParameters,
- NULL, /* &outputParameters, */
- SAMPLE_RATE,
- FRAMES_PER_BUFFER,
- paClipOff, /* we won't output out of range samples so don't bother clipping them */
- recordCallback,
- &data );
- if( err != paNoError ) goto done;
-
- err = Pa_StartStream( stream );
- if( err != paNoError ) goto done;
- printf("\n=== Now recording!! Please speak into the microphone. ===\n"); fflush(stdout);
-
- while( ( err = Pa_IsStreamActive( stream ) ) == 1 )
- {
- Pa_Sleep(1000);
- printf("index = %d\n", data.frameIndex ); fflush(stdout);
- }
- if( err < 0 ) goto done;
-
- err = Pa_CloseStream( stream );
- if( err != paNoError ) goto done;
-
- /* Measure maximum peak amplitude. */
- max = 0;
- average = 0.0;
- for( i=0; i<numSamples; i++ )
- {
- val = data.recordedSamples[i];
- if( val < 0 ) val = -val; /* ABS */
- if( val > max )
- {
- max = val;
- }
- average += val;
- }
-
- average = average / (double)numSamples;
-
- printf("sample max amplitude = "PRINTF_S_FORMAT"\n", max );
- printf("sample average = %lf\n", average );
-
- /* Write recorded data to a file. */
-#if WRITE_TO_FILE
- {
- FILE *fid;
- fid = fopen("recorded.raw", "wb");
- if( fid == NULL )
- {
- printf("Could not open file.");
- }
- else
- {
- fwrite( data.recordedSamples, NUM_CHANNELS * sizeof(SAMPLE), totalFrames, fid );
- fclose( fid );
- printf("Wrote data to 'recorded.raw'\n");
- }
- }
-#endif
-
- /* Playback recorded data. -------------------------------------------- */
- data.frameIndex = 0;
-
- outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */
- if (outputParameters.device == paNoDevice) {
- fprintf(stderr,"Error: No default output device.\n");
- goto done;
- }
- outputParameters.channelCount = 2; /* stereo output */
- outputParameters.sampleFormat = PA_SAMPLE_TYPE;
- outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency;
- outputParameters.hostApiSpecificStreamInfo = NULL;
-
- printf("\n=== Now playing back. ===\n"); fflush(stdout);
- err = Pa_OpenStream(
- &stream,
- NULL, /* no input */
- &outputParameters,
- SAMPLE_RATE,
- FRAMES_PER_BUFFER,
- paClipOff, /* we won't output out of range samples so don't bother clipping them */
- playCallback,
- &data );
- if( err != paNoError ) goto done;
-
- if( stream )
- {
- err = Pa_StartStream( stream );
- if( err != paNoError ) goto done;
-
- printf("Waiting for playback to finish.\n"); fflush(stdout);
-
- while( ( err = Pa_IsStreamActive( stream ) ) == 1 ) Pa_Sleep(100);
- if( err < 0 ) goto done;
-
- err = Pa_CloseStream( stream );
- if( err != paNoError ) goto done;
-
- printf("Done.\n"); fflush(stdout);
- }
-
-done:
- Pa_Terminate();
- if( data.recordedSamples ) /* Sure it is NULL or valid. */
- free( data.recordedSamples );
- if( err != paNoError )
- {
- fprintf( stderr, "An error occurred while using the portaudio stream\n" );
- fprintf( stderr, "Error number: %d\n", err );
- fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
- err = 1; /* Always return 0 or 1, but no other return codes. */
- }
- return err;
-}
diff --git a/portaudio/examples/paex_record_file.c b/portaudio/examples/paex_record_file.c
deleted file mode 100644
index 562a8e9..0000000
--- a/portaudio/examples/paex_record_file.c
+++ /dev/null
@@ -1,457 +0,0 @@
-/** @file paex_record_file.c
- @ingroup examples_src
- @brief Record input into a file, then playback recorded data from file (Windows only at the moment)
- @author Robert Bielik
-*/
-/*
- * $Id: paex_record_file.c 1752 2011-09-08 03:21:55Z philburk $
- *
- * This program uses the PortAudio Portable Audio Library.
- * For more information see: http://www.portaudio.com
- * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The text above constitutes the entire PortAudio license; however,
- * the PortAudio community also makes the following non-binding requests:
- *
- * Any person wishing to distribute modifications to the Software is
- * requested to send the modifications to the original developer so that
- * they can be incorporated into the canonical version. It is also
- * requested that these non-binding requests be included along with the
- * license above.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include "portaudio.h"
-#include "pa_ringbuffer.h"
-#include "pa_util.h"
-
-#ifdef _WIN32
-#include <windows.h>
-#include <process.h>
-#endif
-
-static ring_buffer_size_t rbs_min(ring_buffer_size_t a, ring_buffer_size_t b)
-{
- return (a < b) ? a : b;
-}
-
-/* #define SAMPLE_RATE (17932) // Test failure to open with this value. */
-#define FILE_NAME "audio_data.raw"
-#define SAMPLE_RATE (44100)
-#define FRAMES_PER_BUFFER (512)
-#define NUM_SECONDS (10)
-#define NUM_CHANNELS (2)
-#define NUM_WRITES_PER_BUFFER (4)
-/* #define DITHER_FLAG (paDitherOff) */
-#define DITHER_FLAG (0) /**/
-
-
-/* Select sample format. */
-#if 1
-#define PA_SAMPLE_TYPE paFloat32
-typedef float SAMPLE;
-#define SAMPLE_SILENCE (0.0f)
-#define PRINTF_S_FORMAT "%.8f"
-#elif 1
-#define PA_SAMPLE_TYPE paInt16
-typedef short SAMPLE;
-#define SAMPLE_SILENCE (0)
-#define PRINTF_S_FORMAT "%d"
-#elif 0
-#define PA_SAMPLE_TYPE paInt8
-typedef char SAMPLE;
-#define SAMPLE_SILENCE (0)
-#define PRINTF_S_FORMAT "%d"
-#else
-#define PA_SAMPLE_TYPE paUInt8
-typedef unsigned char SAMPLE;
-#define SAMPLE_SILENCE (128)
-#define PRINTF_S_FORMAT "%d"
-#endif
-
-typedef struct
-{
- unsigned frameIndex;
- int threadSyncFlag;
- SAMPLE *ringBufferData;
- PaUtilRingBuffer ringBuffer;
- FILE *file;
- void *threadHandle;
-}
-paTestData;
-
-/* This routine is run in a separate thread to write data from the ring buffer into a file (during Recording) */
-static int threadFunctionWriteToRawFile(void* ptr)
-{
- paTestData* pData = (paTestData*)ptr;
-
- /* Mark thread started */
- pData->threadSyncFlag = 0;
-
- while (1)
- {
- ring_buffer_size_t elementsInBuffer = PaUtil_GetRingBufferReadAvailable(&pData->ringBuffer);
- if ( (elementsInBuffer >= pData->ringBuffer.bufferSize / NUM_WRITES_PER_BUFFER) ||
- pData->threadSyncFlag )
- {
- void* ptr[2] = {0};
- ring_buffer_size_t sizes[2] = {0};
-
- /* By using PaUtil_GetRingBufferReadRegions, we can read directly from the ring buffer */
- ring_buffer_size_t elementsRead = PaUtil_GetRingBufferReadRegions(&pData->ringBuffer, elementsInBuffer, ptr + 0, sizes + 0, ptr + 1, sizes + 1);
- if (elementsRead > 0)
- {
- int i;
- for (i = 0; i < 2 && ptr[i] != NULL; ++i)
- {
- fwrite(ptr[i], pData->ringBuffer.elementSizeBytes, sizes[i], pData->file);
- }
- PaUtil_AdvanceRingBufferReadIndex(&pData->ringBuffer, elementsRead);
- }
-
- if (pData->threadSyncFlag)
- {
- break;
- }
- }
-
- /* Sleep a little while... */
- Pa_Sleep(20);
- }
-
- pData->threadSyncFlag = 0;
-
- return 0;
-}
-
-/* This routine is run in a separate thread to read data from file into the ring buffer (during Playback). When the file
- has reached EOF, a flag is set so that the play PA callback can return paComplete */
-static int threadFunctionReadFromRawFile(void* ptr)
-{
- paTestData* pData = (paTestData*)ptr;
-
- while (1)
- {
- ring_buffer_size_t elementsInBuffer = PaUtil_GetRingBufferWriteAvailable(&pData->ringBuffer);
-
- if (elementsInBuffer >= pData->ringBuffer.bufferSize / NUM_WRITES_PER_BUFFER)
- {
- void* ptr[2] = {0};
- ring_buffer_size_t sizes[2] = {0};
-
- /* By using PaUtil_GetRingBufferWriteRegions, we can write directly into the ring buffer */
- PaUtil_GetRingBufferWriteRegions(&pData->ringBuffer, elementsInBuffer, ptr + 0, sizes + 0, ptr + 1, sizes + 1);
-
- if (!feof(pData->file))
- {
- ring_buffer_size_t itemsReadFromFile = 0;
- int i;
- for (i = 0; i < 2 && ptr[i] != NULL; ++i)
- {
- itemsReadFromFile += (ring_buffer_size_t)fread(ptr[i], pData->ringBuffer.elementSizeBytes, sizes[i], pData->file);
- }
- PaUtil_AdvanceRingBufferWriteIndex(&pData->ringBuffer, itemsReadFromFile);
-
- /* Mark thread started here, that way we "prime" the ring buffer before playback */
- pData->threadSyncFlag = 0;
- }
- else
- {
- /* No more data to read */
- pData->threadSyncFlag = 1;
- break;
- }
- }
-
- /* Sleep a little while... */
- Pa_Sleep(20);
- }
-
- return 0;
-}
-
-typedef int (*ThreadFunctionType)(void*);
-
-/* Start up a new thread in the given function, at the moment only Windows, but should be very easy to extend
- to posix type OSs (Linux/Mac) */
-static PaError startThread( paTestData* pData, ThreadFunctionType fn )
-{
-#ifdef _WIN32
- typedef unsigned (__stdcall* WinThreadFunctionType)(void*);
- pData->threadHandle = (void*)_beginthreadex(NULL, 0, (WinThreadFunctionType)fn, pData, CREATE_SUSPENDED, NULL);
- if (pData->threadHandle == NULL) return paUnanticipatedHostError;
-
- /* Set file thread to a little higher prio than normal */
- SetThreadPriority(pData->threadHandle, THREAD_PRIORITY_ABOVE_NORMAL);
-
- /* Start it up */
- pData->threadSyncFlag = 1;
- ResumeThread(pData->threadHandle);
-
-#endif
-
- /* Wait for thread to startup */
- while (pData->threadSyncFlag) {
- Pa_Sleep(10);
- }
-
- return paNoError;
-}
-
-static int stopThread( paTestData* pData )
-{
- pData->threadSyncFlag = 1;
- /* Wait for thread to stop */
- while (pData->threadSyncFlag) {
- Pa_Sleep(10);
- }
-#ifdef _WIN32
- CloseHandle(pData->threadHandle);
- pData->threadHandle = 0;
-#endif
-
- return paNoError;
-}
-
-
-/* This routine will be called by the PortAudio engine when audio is needed.
-** It may be called at interrupt level on some machines so don't do anything
-** that could mess up the system like calling malloc() or free().
-*/
-static int recordCallback( const void *inputBuffer, void *outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo* timeInfo,
- PaStreamCallbackFlags statusFlags,
- void *userData )
-{
- paTestData *data = (paTestData*)userData;
- ring_buffer_size_t elementsWriteable = PaUtil_GetRingBufferWriteAvailable(&data->ringBuffer);
- ring_buffer_size_t elementsToWrite = rbs_min(elementsWriteable, (ring_buffer_size_t)(framesPerBuffer * NUM_CHANNELS));
- const SAMPLE *rptr = (const SAMPLE*)inputBuffer;
-
- (void) outputBuffer; /* Prevent unused variable warnings. */
- (void) timeInfo;
- (void) statusFlags;
- (void) userData;
-
- data->frameIndex += PaUtil_WriteRingBuffer(&data->ringBuffer, rptr, elementsToWrite);
-
- return paContinue;
-}
-
-/* This routine will be called by the PortAudio engine when audio is needed.
-** It may be called at interrupt level on some machines so don't do anything
-** that could mess up the system like calling malloc() or free().
-*/
-static int playCallback( const void *inputBuffer, void *outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo* timeInfo,
- PaStreamCallbackFlags statusFlags,
- void *userData )
-{
- paTestData *data = (paTestData*)userData;
- ring_buffer_size_t elementsToPlay = PaUtil_GetRingBufferReadAvailable(&data->ringBuffer);
- ring_buffer_size_t elementsToRead = rbs_min(elementsToPlay, (ring_buffer_size_t)(framesPerBuffer * NUM_CHANNELS));
- SAMPLE* wptr = (SAMPLE*)outputBuffer;
-
- (void) inputBuffer; /* Prevent unused variable warnings. */
- (void) timeInfo;
- (void) statusFlags;
- (void) userData;
-
- data->frameIndex += PaUtil_ReadRingBuffer(&data->ringBuffer, wptr, elementsToRead);
-
- return data->threadSyncFlag ? paComplete : paContinue;
-}
-
-static unsigned NextPowerOf2(unsigned val)
-{
- val--;
- val = (val >> 1) | val;
- val = (val >> 2) | val;
- val = (val >> 4) | val;
- val = (val >> 8) | val;
- val = (val >> 16) | val;
- return ++val;
-}
-
-/*******************************************************************/
-int main(void);
-int main(void)
-{
- PaStreamParameters inputParameters,
- outputParameters;
- PaStream* stream;
- PaError err = paNoError;
- paTestData data = {0};
- unsigned delayCntr;
- unsigned numSamples;
- unsigned numBytes;
-
- printf("patest_record.c\n"); fflush(stdout);
-
- /* We set the ring buffer size to about 500 ms */
- numSamples = NextPowerOf2((unsigned)(SAMPLE_RATE * 0.5 * NUM_CHANNELS));
- numBytes = numSamples * sizeof(SAMPLE);
- data.ringBufferData = (SAMPLE *) PaUtil_AllocateMemory( numBytes );
- if( data.ringBufferData == NULL )
- {
- printf("Could not allocate ring buffer data.\n");
- goto done;
- }
-
- if (PaUtil_InitializeRingBuffer(&data.ringBuffer, sizeof(SAMPLE), numSamples, data.ringBufferData) < 0)
- {
- printf("Failed to initialize ring buffer. Size is not power of 2 ??\n");
- goto done;
- }
-
- err = Pa_Initialize();
- if( err != paNoError ) goto done;
-
- inputParameters.device = Pa_GetDefaultInputDevice(); /* default input device */
- if (inputParameters.device == paNoDevice) {
- fprintf(stderr,"Error: No default input device.\n");
- goto done;
- }
- inputParameters.channelCount = 2; /* stereo input */
- inputParameters.sampleFormat = PA_SAMPLE_TYPE;
- inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputParameters.device )->defaultLowInputLatency;
- inputParameters.hostApiSpecificStreamInfo = NULL;
-
- /* Record some audio. -------------------------------------------- */
- err = Pa_OpenStream(
- &stream,
- &inputParameters,
- NULL, /* &outputParameters, */
- SAMPLE_RATE,
- FRAMES_PER_BUFFER,
- paClipOff, /* we won't output out of range samples so don't bother clipping them */
- recordCallback,
- &data );
- if( err != paNoError ) goto done;
-
- /* Open the raw audio 'cache' file... */
- data.file = fopen(FILE_NAME, "wb");
- if (data.file == 0) goto done;
-
- /* Start the file writing thread */
- err = startThread(&data, threadFunctionWriteToRawFile);
- if( err != paNoError ) goto done;
-
- err = Pa_StartStream( stream );
- if( err != paNoError ) goto done;
- printf("\n=== Now recording to '" FILE_NAME "' for %d seconds!! Please speak into the microphone. ===\n", NUM_SECONDS); fflush(stdout);
-
- /* Note that the RECORDING part is limited with TIME, not size of the file and/or buffer, so you can
- increase NUM_SECONDS until you run out of disk */
- delayCntr = 0;
- while( delayCntr++ < NUM_SECONDS )
- {
- printf("index = %d\n", data.frameIndex ); fflush(stdout);
- Pa_Sleep(1000);
- }
- if( err < 0 ) goto done;
-
- err = Pa_CloseStream( stream );
- if( err != paNoError ) goto done;
-
- /* Stop the thread */
- err = stopThread(&data);
- if( err != paNoError ) goto done;
-
- /* Close file */
- fclose(data.file);
- data.file = 0;
-
- /* Playback recorded data. -------------------------------------------- */
- data.frameIndex = 0;
-
- outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */
- if (outputParameters.device == paNoDevice) {
- fprintf(stderr,"Error: No default output device.\n");
- goto done;
- }
- outputParameters.channelCount = 2; /* stereo output */
- outputParameters.sampleFormat = PA_SAMPLE_TYPE;
- outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency;
- outputParameters.hostApiSpecificStreamInfo = NULL;
-
- printf("\n=== Now playing back from file '" FILE_NAME "' until end-of-file is reached ===\n"); fflush(stdout);
- err = Pa_OpenStream(
- &stream,
- NULL, /* no input */
- &outputParameters,
- SAMPLE_RATE,
- FRAMES_PER_BUFFER,
- paClipOff, /* we won't output out of range samples so don't bother clipping them */
- playCallback,
- &data );
- if( err != paNoError ) goto done;
-
- if( stream )
- {
- /* Open file again for reading */
- data.file = fopen(FILE_NAME, "rb");
- if (data.file != 0)
- {
- /* Start the file reading thread */
- err = startThread(&data, threadFunctionReadFromRawFile);
- if( err != paNoError ) goto done;
-
- err = Pa_StartStream( stream );
- if( err != paNoError ) goto done;
-
- printf("Waiting for playback to finish.\n"); fflush(stdout);
-
- /* The playback will end when EOF is reached */
- while( ( err = Pa_IsStreamActive( stream ) ) == 1 ) {
- printf("index = %d\n", data.frameIndex ); fflush(stdout);
- Pa_Sleep(1000);
- }
- if( err < 0 ) goto done;
- }
-
- err = Pa_CloseStream( stream );
- if( err != paNoError ) goto done;
-
- fclose(data.file);
-
- printf("Done.\n"); fflush(stdout);
- }
-
-done:
- Pa_Terminate();
- if( data.ringBufferData ) /* Sure it is NULL or valid. */
- PaUtil_FreeMemory( data.ringBufferData );
- if( err != paNoError )
- {
- fprintf( stderr, "An error occurred while using the portaudio stream\n" );
- fprintf( stderr, "Error number: %d\n", err );
- fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
- err = 1; /* Always return 0 or 1, but no other return codes. */
- }
- return err;
-}
diff --git a/portaudio/examples/paex_saw.c b/portaudio/examples/paex_saw.c
deleted file mode 100644
index caec0b0..0000000
--- a/portaudio/examples/paex_saw.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/** @file paex_saw.c
- @ingroup examples_src
- @brief Play a simple (aliasing) sawtooth wave.
- @author Phil Burk http://www.softsynth.com
-*/
-/*
- * $Id$
- *
- * This program uses the PortAudio Portable Audio Library.
- * For more information see: http://www.portaudio.com
- * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The text above constitutes the entire PortAudio license; however,
- * the PortAudio community also makes the following non-binding requests:
- *
- * Any person wishing to distribute modifications to the Software is
- * requested to send the modifications to the original developer so that
- * they can be incorporated into the canonical version. It is also
- * requested that these non-binding requests be included along with the
- * license above.
- */
-
-#include <stdio.h>
-#include <math.h>
-#include "portaudio.h"
-#define NUM_SECONDS (4)
-#define SAMPLE_RATE (44100)
-
-typedef struct
-{
- float left_phase;
- float right_phase;
-}
-paTestData;
-
-/* This routine will be called by the PortAudio engine when audio is needed.
-** It may called at interrupt level on some machines so don't do anything
-** that could mess up the system like calling malloc() or free().
-*/
-static int patestCallback( const void *inputBuffer, void *outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo* timeInfo,
- PaStreamCallbackFlags statusFlags,
- void *userData )
-{
- /* Cast data passed through stream to our structure. */
- paTestData *data = (paTestData*)userData;
- float *out = (float*)outputBuffer;
- unsigned int i;
- (void) inputBuffer; /* Prevent unused variable warning. */
-
- for( i=0; i<framesPerBuffer; i++ )
- {
- *out++ = data->left_phase; /* left */
- *out++ = data->right_phase; /* right */
- /* Generate simple sawtooth phaser that ranges between -1.0 and 1.0. */
- data->left_phase += 0.01f;
- /* When signal reaches top, drop back down. */
- if( data->left_phase >= 1.0f ) data->left_phase -= 2.0f;
- /* higher pitch so we can distinguish left and right. */
- data->right_phase += 0.03f;
- if( data->right_phase >= 1.0f ) data->right_phase -= 2.0f;
- }
- return 0;
-}
-
-/*******************************************************************/
-static paTestData data;
-int main(void);
-int main(void)
-{
- PaStream *stream;
- PaError err;
-
- printf("PortAudio Test: output sawtooth wave.\n");
- /* Initialize our data for use by callback. */
- data.left_phase = data.right_phase = 0.0;
- /* Initialize library before making any other calls. */
- err = Pa_Initialize();
- if( err != paNoError ) goto error;
-
- /* Open an audio I/O stream. */
- err = Pa_OpenDefaultStream( &stream,
- 0, /* no input channels */
- 2, /* stereo output */
- paFloat32, /* 32 bit floating point output */
- SAMPLE_RATE,
- 256, /* frames per buffer */
- patestCallback,
- &data );
- if( err != paNoError ) goto error;
-
- err = Pa_StartStream( stream );
- if( err != paNoError ) goto error;
-
- /* Sleep for several seconds. */
- Pa_Sleep(NUM_SECONDS*1000);
-
- err = Pa_StopStream( stream );
- if( err != paNoError ) goto error;
- err = Pa_CloseStream( stream );
- if( err != paNoError ) goto error;
- Pa_Terminate();
- printf("Test finished.\n");
- return err;
-error:
- Pa_Terminate();
- fprintf( stderr, "An error occurred while using the portaudio stream\n" );
- fprintf( stderr, "Error number: %d\n", err );
- fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
- return err;
-}
diff --git a/portaudio/examples/paex_sine.c b/portaudio/examples/paex_sine.c
deleted file mode 100644
index 50ef205..0000000
--- a/portaudio/examples/paex_sine.c
+++ /dev/null
@@ -1,175 +0,0 @@
-/** @file paex_sine.c
- @ingroup examples_src
- @brief Play a sine wave for several seconds.
- @author Ross Bencina <rossb@audiomulch.com>
- @author Phil Burk <philburk@softsynth.com>
-*/
-/*
- * $Id$
- *
- * This program uses the PortAudio Portable Audio Library.
- * For more information see: http://www.portaudio.com/
- * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The text above constitutes the entire PortAudio license; however,
- * the PortAudio community also makes the following non-binding requests:
- *
- * Any person wishing to distribute modifications to the Software is
- * requested to send the modifications to the original developer so that
- * they can be incorporated into the canonical version. It is also
- * requested that these non-binding requests be included along with the
- * license above.
- */
-#include <stdio.h>
-#include <math.h>
-#include "portaudio.h"
-
-#define NUM_SECONDS (5)
-#define SAMPLE_RATE (44100)
-#define FRAMES_PER_BUFFER (64)
-
-#ifndef M_PI
-#define M_PI (3.14159265)
-#endif
-
-#define TABLE_SIZE (200)
-typedef struct
-{
- float sine[TABLE_SIZE];
- int left_phase;
- int right_phase;
- char message[20];
-}
-paTestData;
-
-/* This routine will be called by the PortAudio engine when audio is needed.
-** It may called at interrupt level on some machines so don't do anything
-** that could mess up the system like calling malloc() or free().
-*/
-static int patestCallback( const void *inputBuffer, void *outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo* timeInfo,
- PaStreamCallbackFlags statusFlags,
- void *userData )
-{
- paTestData *data = (paTestData*)userData;
- float *out = (float*)outputBuffer;
- unsigned long i;
-
- (void) timeInfo; /* Prevent unused variable warnings. */
- (void) statusFlags;
- (void) inputBuffer;
-
- for( i=0; i<framesPerBuffer; i++ )
- {
- *out++ = data->sine[data->left_phase]; /* left */
- *out++ = data->sine[data->right_phase]; /* right */
- data->left_phase += 1;
- if( data->left_phase >= TABLE_SIZE ) data->left_phase -= TABLE_SIZE;
- data->right_phase += 3; /* higher pitch so we can distinguish left and right. */
- if( data->right_phase >= TABLE_SIZE ) data->right_phase -= TABLE_SIZE;
- }
-
- return paContinue;
-}
-
-/*
- * This routine is called by portaudio when playback is done.
- */
-static void StreamFinished( void* userData )
-{
- paTestData *data = (paTestData *) userData;
- printf( "Stream Completed: %s\n", data->message );
-}
-
-/*******************************************************************/
-int main(void);
-int main(void)
-{
- PaStreamParameters outputParameters;
- PaStream *stream;
- PaError err;
- paTestData data;
- int i;
-
- printf("PortAudio Test: output sine wave. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER);
-
- /* initialise sinusoidal wavetable */
- for( i=0; i<TABLE_SIZE; i++ )
- {
- data.sine[i] = (float) sin( ((double)i/(double)TABLE_SIZE) * M_PI * 2. );
- }
- data.left_phase = data.right_phase = 0;
-
- err = Pa_Initialize();
- if( err != paNoError ) goto error;
-
- outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */
- if (outputParameters.device == paNoDevice) {
- fprintf(stderr,"Error: No default output device.\n");
- goto error;
- }
- outputParameters.channelCount = 2; /* stereo output */
- outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */
- outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency;
- outputParameters.hostApiSpecificStreamInfo = NULL;
-
- err = Pa_OpenStream(
- &stream,
- NULL, /* no input */
- &outputParameters,
- SAMPLE_RATE,
- FRAMES_PER_BUFFER,
- paClipOff, /* we won't output out of range samples so don't bother clipping them */
- patestCallback,
- &data );
- if( err != paNoError ) goto error;
-
- sprintf( data.message, "No Message" );
- err = Pa_SetStreamFinishedCallback( stream, &StreamFinished );
- if( err != paNoError ) goto error;
-
- err = Pa_StartStream( stream );
- if( err != paNoError ) goto error;
-
- printf("Play for %d seconds.\n", NUM_SECONDS );
- Pa_Sleep( NUM_SECONDS * 1000 );
-
- err = Pa_StopStream( stream );
- if( err != paNoError ) goto error;
-
- err = Pa_CloseStream( stream );
- if( err != paNoError ) goto error;
-
- Pa_Terminate();
- printf("Test finished.\n");
-
- return err;
-error:
- Pa_Terminate();
- fprintf( stderr, "An error occurred while using the portaudio stream\n" );
- fprintf( stderr, "Error number: %d\n", err );
- fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
- return err;
-}
diff --git a/portaudio/examples/paex_sine_c++.cpp b/portaudio/examples/paex_sine_c++.cpp
deleted file mode 100644
index 5d96522..0000000
--- a/portaudio/examples/paex_sine_c++.cpp
+++ /dev/null
@@ -1,275 +0,0 @@
-/** @file paex_sine.c
- @ingroup examples_src
- @brief Play a sine wave for several seconds.
- @author Ross Bencina <rossb@audiomulch.com>
- @author Phil Burk <philburk@softsynth.com>
-*/
-/*
- * $Id: paex_sine.c 1752 2011-09-08 03:21:55Z philburk $
- *
- * This program uses the PortAudio Portable Audio Library.
- * For more information see: http://www.portaudio.com/
- * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The text above constitutes the entire PortAudio license; however,
- * the PortAudio community also makes the following non-binding requests:
- *
- * Any person wishing to distribute modifications to the Software is
- * requested to send the modifications to the original developer so that
- * they can be incorporated into the canonical version. It is also
- * requested that these non-binding requests be included along with the
- * license above.
- */
-#include <stdio.h>
-#include <math.h>
-#include "portaudio.h"
-
-#define NUM_SECONDS (5)
-#define SAMPLE_RATE (44100)
-#define FRAMES_PER_BUFFER (64)
-
-#ifndef M_PI
-#define M_PI (3.14159265)
-#endif
-
-#define TABLE_SIZE (200)
-
-class Sine
-{
-public:
- Sine() : stream(0), left_phase(0), right_phase(0)
- {
- /* initialise sinusoidal wavetable */
- for( int i=0; i<TABLE_SIZE; i++ )
- {
- sine[i] = (float) sin( ((double)i/(double)TABLE_SIZE) * M_PI * 2. );
- }
-
- sprintf( message, "No Message" );
- }
-
- bool open(PaDeviceIndex index)
- {
- PaStreamParameters outputParameters;
-
- outputParameters.device = index;
- if (outputParameters.device == paNoDevice) {
- return false;
- }
-
- const PaDeviceInfo* pInfo = Pa_GetDeviceInfo(index);
- if (pInfo != 0)
- {
- printf("Output device name: '%s'\r", pInfo->name);
- }
-
- outputParameters.channelCount = 2; /* stereo output */
- outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */
- outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency;
- outputParameters.hostApiSpecificStreamInfo = NULL;
-
- PaError err = Pa_OpenStream(
- &stream,
- NULL, /* no input */
- &outputParameters,
- SAMPLE_RATE,
- paFramesPerBufferUnspecified,
- paClipOff, /* we won't output out of range samples so don't bother clipping them */
- &Sine::paCallback,
- this /* Using 'this' for userData so we can cast to Sine* in paCallback method */
- );
-
- if (err != paNoError)
- {
- /* Failed to open stream to device !!! */
- return false;
- }
-
- err = Pa_SetStreamFinishedCallback( stream, &Sine::paStreamFinished );
-
- if (err != paNoError)
- {
- Pa_CloseStream( stream );
- stream = 0;
-
- return false;
- }
-
- return true;
- }
-
- bool close()
- {
- if (stream == 0)
- return false;
-
- PaError err = Pa_CloseStream( stream );
- stream = 0;
-
- return (err == paNoError);
- }
-
-
- bool start()
- {
- if (stream == 0)
- return false;
-
- PaError err = Pa_StartStream( stream );
-
- return (err == paNoError);
- }
-
- bool stop()
- {
- if (stream == 0)
- return false;
-
- PaError err = Pa_StopStream( stream );
-
- return (err == paNoError);
- }
-
-private:
- /* The instance callback, where we have access to every method/variable in object of class Sine */
- int paCallbackMethod(const void *inputBuffer, void *outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo* timeInfo,
- PaStreamCallbackFlags statusFlags)
- {
- float *out = (float*)outputBuffer;
- unsigned long i;
-
- (void) timeInfo; /* Prevent unused variable warnings. */
- (void) statusFlags;
- (void) inputBuffer;
-
- for( i=0; i<framesPerBuffer; i++ )
- {
- *out++ = sine[left_phase]; /* left */
- *out++ = sine[right_phase]; /* right */
- left_phase += 1;
- if( left_phase >= TABLE_SIZE ) left_phase -= TABLE_SIZE;
- right_phase += 3; /* higher pitch so we can distinguish left and right. */
- if( right_phase >= TABLE_SIZE ) right_phase -= TABLE_SIZE;
- }
-
- return paContinue;
-
- }
-
- /* This routine will be called by the PortAudio engine when audio is needed.
- ** It may called at interrupt level on some machines so don't do anything
- ** that could mess up the system like calling malloc() or free().
- */
- static int paCallback( const void *inputBuffer, void *outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo* timeInfo,
- PaStreamCallbackFlags statusFlags,
- void *userData )
- {
- /* Here we cast userData to Sine* type so we can call the instance method paCallbackMethod, we can do that since
- we called Pa_OpenStream with 'this' for userData */
- return ((Sine*)userData)->paCallbackMethod(inputBuffer, outputBuffer,
- framesPerBuffer,
- timeInfo,
- statusFlags);
- }
-
-
- void paStreamFinishedMethod()
- {
- printf( "Stream Completed: %s\n", message );
- }
-
- /*
- * This routine is called by portaudio when playback is done.
- */
- static void paStreamFinished(void* userData)
- {
- return ((Sine*)userData)->paStreamFinishedMethod();
- }
-
- PaStream *stream;
- float sine[TABLE_SIZE];
- int left_phase;
- int right_phase;
- char message[20];
-};
-
-class ScopedPaHandler
-{
-public:
- ScopedPaHandler()
- : _result(Pa_Initialize())
- {
- }
- ~ScopedPaHandler()
- {
- if (_result == paNoError)
- {
- Pa_Terminate();
- }
- }
-
- PaError result() const { return _result; }
-
-private:
- PaError _result;
-};
-
-
-/*******************************************************************/
-int main(void);
-int main(void)
-{
- Sine sine;
-
- printf("PortAudio Test: output sine wave. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER);
-
- ScopedPaHandler paInit;
- if( paInit.result() != paNoError ) goto error;
-
- if (sine.open(Pa_GetDefaultOutputDevice()))
- {
- if (sine.start())
- {
- printf("Play for %d seconds.\n", NUM_SECONDS );
- Pa_Sleep( NUM_SECONDS * 1000 );
-
- sine.stop();
- }
-
- sine.close();
- }
-
- printf("Test finished.\n");
- return paNoError;
-
-error:
- fprintf( stderr, "An error occurred while using the portaudio stream\n" );
- fprintf( stderr, "Error number: %d\n", paInit.result() );
- fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( paInit.result() ) );
- return 1;
-}
diff --git a/portaudio/examples/paex_wmme_ac3.c b/portaudio/examples/paex_wmme_ac3.c
deleted file mode 100644
index 74daa96..0000000
--- a/portaudio/examples/paex_wmme_ac3.c
+++ /dev/null
@@ -1,220 +0,0 @@
-/** @file paex_wmme_ac3.c
- @ingroup examples_src
- @brief Use WMME-specific interface to send raw AC3 data to a S/PDIF output.
- @author Ross Bencina <rossb@audiomulch.com>
-*/
-/*
- * $Id: $
- * Portable Audio I/O Library
- * Windows MME ac3 sound output test
- *
- * Copyright (c) 2009 Ross Bencina
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The text above constitutes the entire PortAudio license; however,
- * the PortAudio community also makes the following non-binding requests:
- *
- * Any person wishing to distribute modifications to the Software is
- * requested to send the modifications to the original developer so that
- * they can be incorporated into the canonical version. It is also
- * requested that these non-binding requests be included along with the
- * license above.
- */
-
-#include <stdio.h>
-#include <math.h>
-
-#include <windows.h> /* required when using pa_win_wmme.h */
-#include <mmsystem.h> /* required when using pa_win_wmme.h */
-
-#include "portaudio.h"
-#include "pa_win_wmme.h"
-
-#define NUM_SECONDS (20)
-#define SAMPLE_RATE (48000)
-#define FRAMES_PER_BUFFER (64)
-
-#ifndef M_PI
-#define M_PI (3.14159265)
-#endif
-
-#define TABLE_SIZE (100)
-
-#define CHANNEL_COUNT (2)
-
-
-
-typedef struct
-{
- short *buffer;
- int bufferSampleCount;
- int playbackIndex;
-}
-paTestData;
-
-/* This routine will be called by the PortAudio engine when audio is needed.
-** It may called at interrupt level on some machines so don't do anything
-** that could mess up the system like calling malloc() or free().
-*/
-static int patestCallback( const void *inputBuffer, void *outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo* timeInfo,
- PaStreamCallbackFlags statusFlags,
- void *userData )
-{
- paTestData *data = (paTestData*)userData;
- short *out = (short*)outputBuffer;
- unsigned long i,j;
-
- (void) timeInfo; /* Prevent unused variable warnings. */
- (void) statusFlags;
- (void) inputBuffer;
-
- /* stream out contents of data->buffer looping at end */
-
- for( i=0; i<framesPerBuffer; i++ )
- {
- for( j = 0; j < CHANNEL_COUNT; ++j ){
- *out++ = data->buffer[ data->playbackIndex++ ];
-
- if( data->playbackIndex >= data->bufferSampleCount )
- data->playbackIndex = 0; /* loop at end of buffer */
- }
- }
-
- return paContinue;
-}
-
-/*******************************************************************/
-int main(int argc, char* argv[])
-{
- PaStreamParameters outputParameters;
- PaWinMmeStreamInfo wmmeStreamInfo;
- PaStream *stream;
- PaError err;
- paTestData data;
- int deviceIndex;
- FILE *fp;
- const char *fileName = "c:\\test_48k.ac3.spdif";
- data.buffer = NULL;
-
- printf("usage: patest_wmme_ac3 fileName [paDeviceIndex]\n");
- printf("**IMPORTANT*** The provided file must include the spdif preamble at the start of every AC-3 frame. Using a normal ac3 file won't work.\n");
- printf("PortAudio Test: output a raw spdif ac3 stream. SR = %d, BufSize = %d, Chans = %d\n",
- SAMPLE_RATE, FRAMES_PER_BUFFER, CHANNEL_COUNT);
-
-
- if( argc >= 2 )
- fileName = argv[1];
-
- printf( "reading spdif ac3 raw stream file %s\n", fileName );
-
- fp = fopen( fileName, "rb" );
- if( !fp ){
- fprintf( stderr, "error opening spdif ac3 file.\n" );
- return -1;
- }
- /* get file size */
- fseek( fp, 0, SEEK_END );
- data.bufferSampleCount = ftell( fp ) / sizeof(short);
- fseek( fp, 0, SEEK_SET );
-
- /* allocate buffer, read the whole file into memory */
- data.buffer = (short*)malloc( data.bufferSampleCount * sizeof(short) );
- if( !data.buffer ){
- fprintf( stderr, "error allocating buffer.\n" );
- return -1;
- }
-
- fread( data.buffer, sizeof(short), data.bufferSampleCount, fp );
- fclose( fp );
-
- data.playbackIndex = 0;
-
- err = Pa_Initialize();
- if( err != paNoError ) goto error;
-
- deviceIndex = Pa_GetHostApiInfo( Pa_HostApiTypeIdToHostApiIndex( paMME ) )->defaultOutputDevice;
- if( argc >= 3 ){
- sscanf( argv[1], "%d", &deviceIndex );
- }
-
- printf( "using device id %d (%s)\n", deviceIndex, Pa_GetDeviceInfo(deviceIndex)->name );
-
-
- outputParameters.device = deviceIndex;
- outputParameters.channelCount = CHANNEL_COUNT;
- outputParameters.sampleFormat = paInt16; /* IMPORTANT must use paInt16 for WMME AC3 */
- outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency;
- outputParameters.hostApiSpecificStreamInfo = NULL;
-
- wmmeStreamInfo.size = sizeof(PaWinMmeStreamInfo);
- wmmeStreamInfo.hostApiType = paMME;
- wmmeStreamInfo.version = 1;
- wmmeStreamInfo.flags = paWinMmeWaveFormatDolbyAc3Spdif;
- outputParameters.hostApiSpecificStreamInfo = &wmmeStreamInfo;
-
-
- if( Pa_IsFormatSupported( 0, &outputParameters, SAMPLE_RATE ) == paFormatIsSupported ){
- printf( "Pa_IsFormatSupported reports device will support %d channels.\n", CHANNEL_COUNT );
- }else{
- printf( "Pa_IsFormatSupported reports device will not support %d channels.\n", CHANNEL_COUNT );
- }
-
- err = Pa_OpenStream(
- &stream,
- NULL, /* no input */
- &outputParameters,
- SAMPLE_RATE,
- FRAMES_PER_BUFFER,
- 0,
- patestCallback,
- &data );
- if( err != paNoError ) goto error;
-
- err = Pa_StartStream( stream );
- if( err != paNoError ) goto error;
-
- printf("Play for %d seconds.\n", NUM_SECONDS );
- Pa_Sleep( NUM_SECONDS * 1000 );
-
- err = Pa_StopStream( stream );
- if( err != paNoError ) goto error;
-
- err = Pa_CloseStream( stream );
- if( err != paNoError ) goto error;
-
- Pa_Terminate();
- free( data.buffer );
- printf("Test finished.\n");
-
- return err;
-error:
- Pa_Terminate();
- free( data.buffer );
-
- fprintf( stderr, "An error occurred while using the portaudio stream\n" );
- fprintf( stderr, "Error number: %d\n", err );
- fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
- return err;
-}
diff --git a/portaudio/examples/paex_wmme_surround.c b/portaudio/examples/paex_wmme_surround.c
deleted file mode 100644
index 55fc255..0000000
--- a/portaudio/examples/paex_wmme_surround.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/** @file paex_wmme_surround.c
- @ingroup examples_src
- @brief Use WMME-specific channelMask to request 5.1 surround sound output.
- @author Ross Bencina <rossb@audiomulch.com>
-*/
-/*
- * $Id: $
- * Portable Audio I/O Library
- * Windows MME surround sound output test
- *
- * Copyright (c) 2007 Ross Bencina
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The text above constitutes the entire PortAudio license; however,
- * the PortAudio community also makes the following non-binding requests:
- *
- * Any person wishing to distribute modifications to the Software is
- * requested to send the modifications to the original developer so that
- * they can be incorporated into the canonical version. It is also
- * requested that these non-binding requests be included along with the
- * license above.
- */
-
-#include <stdio.h>
-#include <math.h>
-
-#include <windows.h> /* required when using pa_win_wmme.h */
-#include <mmsystem.h> /* required when using pa_win_wmme.h */
-
-#include "portaudio.h"
-#include "pa_win_wmme.h"
-
-#define NUM_SECONDS (12)
-#define SAMPLE_RATE (44100)
-#define FRAMES_PER_BUFFER (64)
-
-#ifndef M_PI
-#define M_PI (3.14159265)
-#endif
-
-#define TABLE_SIZE (100)
-
-#define CHANNEL_COUNT (6)
-
-
-
-typedef struct
-{
- float sine[TABLE_SIZE];
- int phase;
- int currentChannel;
- int cycleCount;
-}
-paTestData;
-
-/* This routine will be called by the PortAudio engine when audio is needed.
-** It may called at interrupt level on some machines so don't do anything
-** that could mess up the system like calling malloc() or free().
-*/
-static int patestCallback( const void *inputBuffer, void *outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo* timeInfo,
- PaStreamCallbackFlags statusFlags,
- void *userData )
-{
- paTestData *data = (paTestData*)userData;
- float *out = (float*)outputBuffer;
- unsigned long i,j;
-
- (void) timeInfo; /* Prevent unused variable warnings. */
- (void) statusFlags;
- (void) inputBuffer;
-
- for( i=0; i<framesPerBuffer; i++ )
- {
- for( j = 0; j < CHANNEL_COUNT; ++j ){
- if( j == data->currentChannel && data->cycleCount < 4410 ){
- *out++ = data->sine[data->phase];
- data->phase += 1 + j; // play each channel at a different pitch so they can be distinguished
- if( data->phase >= TABLE_SIZE ){
- data->phase -= TABLE_SIZE;
- }
- }else{
- *out++ = 0;
- }
- }
-
- data->cycleCount++;
- if( data->cycleCount > 44100 ){
- data->cycleCount = 0;
-
- ++data->currentChannel;
- if( data->currentChannel >= CHANNEL_COUNT )
- data->currentChannel -= CHANNEL_COUNT;
- }
- }
-
- return paContinue;
-}
-
-/*******************************************************************/
-int main(int argc, char* argv[])
-{
- PaStreamParameters outputParameters;
- PaWinMmeStreamInfo wmmeStreamInfo;
- PaStream *stream;
- PaError err;
- paTestData data;
- int i;
- int deviceIndex;
-
- printf("PortAudio Test: output a sine blip on each channel. SR = %d, BufSize = %d, Chans = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER, CHANNEL_COUNT);
-
- err = Pa_Initialize();
- if( err != paNoError ) goto error;
-
- deviceIndex = Pa_GetHostApiInfo( Pa_HostApiTypeIdToHostApiIndex( paMME ) )->defaultOutputDevice;
- if( argc == 2 ){
- sscanf( argv[1], "%d", &deviceIndex );
- }
-
- printf( "using device id %d (%s)\n", deviceIndex, Pa_GetDeviceInfo(deviceIndex)->name );
-
- /* initialise sinusoidal wavetable */
- for( i=0; i<TABLE_SIZE; i++ )
- {
- data.sine[i] = (float) sin( ((double)i/(double)TABLE_SIZE) * M_PI * 2. );
- }
-
- data.phase = 0;
- data.currentChannel = 0;
- data.cycleCount = 0;
-
- outputParameters.device = deviceIndex;
- outputParameters.channelCount = CHANNEL_COUNT;
- outputParameters.sampleFormat = paFloat32; /* 32 bit floating point processing */
- outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency;
- outputParameters.hostApiSpecificStreamInfo = NULL;
-
- /* it's not strictly necessary to provide a channelMask for surround sound
- output. But if you want to be sure which channel mask PortAudio will use
- then you should supply one */
- wmmeStreamInfo.size = sizeof(PaWinMmeStreamInfo);
- wmmeStreamInfo.hostApiType = paMME;
- wmmeStreamInfo.version = 1;
- wmmeStreamInfo.flags = paWinMmeUseChannelMask;
- wmmeStreamInfo.channelMask = PAWIN_SPEAKER_5POINT1; /* request 5.1 output format */
- outputParameters.hostApiSpecificStreamInfo = &wmmeStreamInfo;
-
-
- if( Pa_IsFormatSupported( 0, &outputParameters, SAMPLE_RATE ) == paFormatIsSupported ){
- printf( "Pa_IsFormatSupported reports device will support %d channels.\n", CHANNEL_COUNT );
- }else{
- printf( "Pa_IsFormatSupported reports device will not support %d channels.\n", CHANNEL_COUNT );
- }
-
- err = Pa_OpenStream(
- &stream,
- NULL, /* no input */
- &outputParameters,
- SAMPLE_RATE,
- FRAMES_PER_BUFFER,
- paClipOff, /* we won't output out of range samples so don't bother clipping them */
- patestCallback,
- &data );
- if( err != paNoError ) goto error;
-
- err = Pa_StartStream( stream );
- if( err != paNoError ) goto error;
-
- printf("Play for %d seconds.\n", NUM_SECONDS );
- Pa_Sleep( NUM_SECONDS * 1000 );
-
- err = Pa_StopStream( stream );
- if( err != paNoError ) goto error;
-
- err = Pa_CloseStream( stream );
- if( err != paNoError ) goto error;
-
- Pa_Terminate();
- printf("Test finished.\n");
-
- return err;
-error:
- Pa_Terminate();
- fprintf( stderr, "An error occurred while using the portaudio stream\n" );
- fprintf( stderr, "Error number: %d\n", err );
- fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
- return err;
-}
diff --git a/portaudio/examples/paex_write_sine.c b/portaudio/examples/paex_write_sine.c
deleted file mode 100644
index 3035b42..0000000
--- a/portaudio/examples/paex_write_sine.c
+++ /dev/null
@@ -1,166 +0,0 @@
-/** @file paex_write_sine.c
- @ingroup examples_src
- @brief Play a sine wave for several seconds using the blocking API (Pa_WriteStream())
- @author Ross Bencina <rossb@audiomulch.com>
- @author Phil Burk <philburk@softsynth.com>
-*/
-/*
- * $Id$
- *
- * This program uses the PortAudio Portable Audio Library.
- * For more information see: http://www.portaudio.com/
- * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The text above constitutes the entire PortAudio license; however,
- * the PortAudio community also makes the following non-binding requests:
- *
- * Any person wishing to distribute modifications to the Software is
- * requested to send the modifications to the original developer so that
- * they can be incorporated into the canonical version. It is also
- * requested that these non-binding requests be included along with the
- * license above.
- */
-
-#include <stdio.h>
-#include <math.h>
-#include "portaudio.h"
-
-#define NUM_SECONDS (5)
-#define SAMPLE_RATE (44100)
-#define FRAMES_PER_BUFFER (1024)
-
-#ifndef M_PI
-#define M_PI (3.14159265)
-#endif
-
-#define TABLE_SIZE (200)
-
-
-int main(void);
-int main(void)
-{
- PaStreamParameters outputParameters;
- PaStream *stream;
- PaError err;
- float buffer[FRAMES_PER_BUFFER][2]; /* stereo output buffer */
- float sine[TABLE_SIZE]; /* sine wavetable */
- int left_phase = 0;
- int right_phase = 0;
- int left_inc = 1;
- int right_inc = 3; /* higher pitch so we can distinguish left and right. */
- int i, j, k;
- int bufferCount;
-
- printf("PortAudio Test: output sine wave. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER);
-
- /* initialise sinusoidal wavetable */
- for( i=0; i<TABLE_SIZE; i++ )
- {
- sine[i] = (float) sin( ((double)i/(double)TABLE_SIZE) * M_PI * 2. );
- }
-
-
- err = Pa_Initialize();
- if( err != paNoError ) goto error;
-
- outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */
- if (outputParameters.device == paNoDevice) {
- fprintf(stderr,"Error: No default output device.\n");
- goto error;
- }
- outputParameters.channelCount = 2; /* stereo output */
- outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */
- outputParameters.suggestedLatency = 0.050; // Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency;
- outputParameters.hostApiSpecificStreamInfo = NULL;
-
- err = Pa_OpenStream(
- &stream,
- NULL, /* no input */
- &outputParameters,
- SAMPLE_RATE,
- FRAMES_PER_BUFFER,
- paClipOff, /* we won't output out of range samples so don't bother clipping them */
- NULL, /* no callback, use blocking API */
- NULL ); /* no callback, so no callback userData */
- if( err != paNoError ) goto error;
-
-
- printf( "Play 3 times, higher each time.\n" );
-
- for( k=0; k < 3; ++k )
- {
- err = Pa_StartStream( stream );
- if( err != paNoError ) goto error;
-
- printf("Play for %d seconds.\n", NUM_SECONDS );
-
- bufferCount = ((NUM_SECONDS * SAMPLE_RATE) / FRAMES_PER_BUFFER);
-
- for( i=0; i < bufferCount; i++ )
- {
- for( j=0; j < FRAMES_PER_BUFFER; j++ )
- {
- buffer[j][0] = sine[left_phase]; /* left */
- buffer[j][1] = sine[right_phase]; /* right */
- left_phase += left_inc;
- if( left_phase >= TABLE_SIZE ) left_phase -= TABLE_SIZE;
- right_phase += right_inc;
- if( right_phase >= TABLE_SIZE ) right_phase -= TABLE_SIZE;
- }
-
- err = Pa_WriteStream( stream, buffer, FRAMES_PER_BUFFER );
- if( err != paNoError ) goto error;
- }
-
- err = Pa_StopStream( stream );
- if( err != paNoError ) goto error;
-
- ++left_inc;
- ++right_inc;
-
- Pa_Sleep( 1000 );
- }
-
- err = Pa_CloseStream( stream );
- if( err != paNoError ) goto error;
-
- Pa_Terminate();
- printf("Test finished.\n");
-
- return err;
-
-error:
- fprintf( stderr, "An error occurred while using the portaudio stream\n" );
- fprintf( stderr, "Error number: %d\n", err );
- fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
- // Print more information about the error.
- if( err == paUnanticipatedHostError )
- {
- const PaHostErrorInfo *hostErrorInfo = Pa_GetLastHostErrorInfo();
- fprintf( stderr, "Host API error = #%ld, hostApiType = %d\n", hostErrorInfo->errorCode, hostErrorInfo->hostApiType );
- fprintf( stderr, "Host API error = %s\n", hostErrorInfo->errorText );
- }
- Pa_Terminate();
- return err;
-}
diff --git a/portaudio/examples/paex_write_sine_nonint.c b/portaudio/examples/paex_write_sine_nonint.c
deleted file mode 100644
index db78ed7..0000000
--- a/portaudio/examples/paex_write_sine_nonint.c
+++ /dev/null
@@ -1,167 +0,0 @@
-/** @file paex_write_sine_nonint.c
- @ingroup examples_src
- @brief Play a non-interleaved sine wave using the blocking API (Pa_WriteStream())
- @author Ross Bencina <rossb@audiomulch.com>
- @author Phil Burk <philburk@softsynth.com>
-*/
-/*
- * $Id: patest_write_sine.c 1368 2008-03-01 00:38:27Z rossb $
- *
- * This program uses the PortAudio Portable Audio Library.
- * For more information see: http://www.portaudio.com/
- * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The text above constitutes the entire PortAudio license; however,
- * the PortAudio community also makes the following non-binding requests:
- *
- * Any person wishing to distribute modifications to the Software is
- * requested to send the modifications to the original developer so that
- * they can be incorporated into the canonical version. It is also
- * requested that these non-binding requests be included along with the
- * license above.
- */
-
-#include <stdio.h>
-#include <math.h>
-#include "portaudio.h"
-
-#define NUM_SECONDS (5)
-#define SAMPLE_RATE (44100)
-#define FRAMES_PER_BUFFER (1024)
-
-#ifndef M_PI
-#define M_PI (3.14159265)
-#endif
-
-#define TABLE_SIZE (200)
-
-
-int main(void);
-int main(void)
-{
- PaStreamParameters outputParameters;
- PaStream *stream;
- PaError err;
-
- float leftBuffer[FRAMES_PER_BUFFER];
- float rightBuffer[FRAMES_PER_BUFFER];
- void *buffers[2]; /* points to both non-interleaved buffers. */
-
- float sine[TABLE_SIZE]; /* sine wavetable */
- int left_phase = 0;
- int right_phase = 0;
- int left_inc = 1;
- int right_inc = 3; /* higher pitch so we can distinguish left and right. */
- int i, j, k;
- int bufferCount;
-
-
- printf("PortAudio Test: output sine wave NON-INTERLEAVED. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER);
-
- /* initialise sinusoidal wavetable */
- for( i=0; i<TABLE_SIZE; i++ )
- {
- sine[i] = (float) sin( ((double)i/(double)TABLE_SIZE) * M_PI * 2. );
- }
-
-
- err = Pa_Initialize();
- if( err != paNoError ) goto error;
-
- outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */
- if (outputParameters.device == paNoDevice) {
- fprintf(stderr,"Error: No default output device.\n");
- goto error;
- }
- outputParameters.channelCount = 2; /* stereo output */
- outputParameters.sampleFormat = paFloat32 | paNonInterleaved; /* 32 bit floating point output NON-INTERLEAVED */
- outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency;
- outputParameters.hostApiSpecificStreamInfo = NULL;
-
- err = Pa_OpenStream(
- &stream,
- NULL, /* no input */
- &outputParameters,
- SAMPLE_RATE,
- FRAMES_PER_BUFFER,
- paClipOff, /* we won't output out of range samples so don't bother clipping them */
- NULL, /* no callback, use blocking API */
- NULL ); /* no callback, so no callback userData */
- if( err != paNoError ) goto error;
-
-
- printf( "Play 3 times, higher each time.\n" );
-
- /* Set up array of buffer pointers for Pa_WriteStream */
- buffers[0] = leftBuffer;
- buffers[1] = rightBuffer;
-
- for( k=0; k < 3; ++k )
- {
- err = Pa_StartStream( stream );
- if( err != paNoError ) goto error;
-
- printf("Play for %d seconds.\n", NUM_SECONDS );
-
- bufferCount = ((NUM_SECONDS * SAMPLE_RATE) / FRAMES_PER_BUFFER);
-
- for( i=0; i < bufferCount; i++ )
- {
- for( j=0; j < FRAMES_PER_BUFFER; j++ )
- {
- leftBuffer[j] = sine[left_phase]; /* left */
- rightBuffer[j] = sine[right_phase]; /* right */
- left_phase += left_inc;
- if( left_phase >= TABLE_SIZE ) left_phase -= TABLE_SIZE;
- right_phase += right_inc;
- if( right_phase >= TABLE_SIZE ) right_phase -= TABLE_SIZE;
- }
-
- err = Pa_WriteStream( stream, buffers, FRAMES_PER_BUFFER );
- if( err != paNoError ) goto error;
- }
-
- err = Pa_StopStream( stream );
- if( err != paNoError ) goto error;
-
- ++left_inc;
- ++right_inc;
-
- Pa_Sleep( 1000 );
- }
-
- err = Pa_CloseStream( stream );
- if( err != paNoError ) goto error;
-
- Pa_Terminate();
- printf("Test finished.\n");
-
- return err;
-error:
- Pa_Terminate();
- fprintf( stderr, "An error occurred while using the portaudio stream\n" );
- fprintf( stderr, "Error number: %d\n", err );
- fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
- return err;
-}