diff options
author | sanine <sanine.not@pm.me> | 2022-08-27 23:52:56 -0500 |
---|---|---|
committer | sanine <sanine.not@pm.me> | 2022-08-27 23:52:56 -0500 |
commit | a4dd0ad63c00f4dee3b86dfd3075d1d61b2b3180 (patch) | |
tree | 13bd5bfa15e6fea2a12f176bae79adf9c6fd0933 /portaudio/examples | |
parent | bde3e4f1bb7b8f8abca0884a7d994ee1c17a66b1 (diff) |
add plibsys
Diffstat (limited to 'portaudio/examples')
-rw-r--r-- | portaudio/examples/CMakeLists.txt | 41 | ||||
-rw-r--r-- | portaudio/examples/pa_devs.c | 252 | ||||
-rw-r--r-- | portaudio/examples/pa_fuzz.c | 183 | ||||
-rw-r--r-- | portaudio/examples/paex_mono_asio_channel_select.c | 167 | ||||
-rw-r--r-- | portaudio/examples/paex_ocean_shore.c | 533 | ||||
-rw-r--r-- | portaudio/examples/paex_pink.c | 280 | ||||
-rw-r--r-- | portaudio/examples/paex_read_write_wire.c | 204 | ||||
-rw-r--r-- | portaudio/examples/paex_record.c | 353 | ||||
-rw-r--r-- | portaudio/examples/paex_record_file.c | 457 | ||||
-rw-r--r-- | portaudio/examples/paex_saw.c | 133 | ||||
-rw-r--r-- | portaudio/examples/paex_sine.c | 175 | ||||
-rw-r--r-- | portaudio/examples/paex_sine_c++.cpp | 275 | ||||
-rw-r--r-- | portaudio/examples/paex_wmme_ac3.c | 220 | ||||
-rw-r--r-- | portaudio/examples/paex_wmme_surround.c | 210 | ||||
-rw-r--r-- | portaudio/examples/paex_write_sine.c | 166 | ||||
-rw-r--r-- | portaudio/examples/paex_write_sine_nonint.c | 167 |
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; -} |