annotate src/portaudio_20140130/test/patest_sine_channelmaps.c @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents 7ddb4fc30dac
children
rev   line source
Chris@39 1 /*
Chris@39 2 * patest_sine_channelmaps.c
Chris@39 3 *
Chris@39 4 * This program uses the PortAudio Portable Audio Library.
Chris@39 5 * For more information see: http://www.portaudio.com/
Chris@39 6 * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
Chris@39 7 *
Chris@39 8 * Permission is hereby granted, free of charge, to any person obtaining
Chris@39 9 * a copy of this software and associated documentation files
Chris@39 10 * (the "Software"), to deal in the Software without restriction,
Chris@39 11 * including without limitation the rights to use, copy, modify, merge,
Chris@39 12 * publish, distribute, sublicense, and/or sell copies of the Software,
Chris@39 13 * and to permit persons to whom the Software is furnished to do so,
Chris@39 14 * subject to the following conditions:
Chris@39 15 *
Chris@39 16 * The above copyright notice and this permission notice shall be
Chris@39 17 * included in all copies or substantial portions of the Software.
Chris@39 18 *
Chris@39 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Chris@39 20 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Chris@39 21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Chris@39 22 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
Chris@39 23 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
Chris@39 24 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
Chris@39 25 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Chris@39 26 */
Chris@39 27
Chris@39 28 /*
Chris@39 29 * The text above constitutes the entire PortAudio license; however,
Chris@39 30 * the PortAudio community also makes the following non-binding requests:
Chris@39 31 *
Chris@39 32 * Any person wishing to distribute modifications to the Software is
Chris@39 33 * requested to send the modifications to the original developer so that
Chris@39 34 * they can be incorporated into the canonical version. It is also
Chris@39 35 * requested that these non-binding requests be included along with the
Chris@39 36 * license above.
Chris@39 37 */
Chris@39 38
Chris@39 39 /** @file patest_sine_channelmaps.c
Chris@39 40 @ingroup test_src
Chris@39 41 @brief Plays sine waves using sme simple channel maps.
Chris@39 42 Designed for use with CoreAudio, but should made to work with other APIs
Chris@39 43 @author Bjorn Roche <bjorn@xowave.com>
Chris@39 44 @author Ross Bencina <rossb@audiomulch.com>
Chris@39 45 @author Phil Burk <philburk@softsynth.com>
Chris@39 46 */
Chris@39 47
Chris@39 48 #include <stdio.h>
Chris@39 49 #include <math.h>
Chris@39 50 #include "portaudio.h"
Chris@39 51
Chris@39 52 #ifdef __APPLE__
Chris@39 53 #include "pa_mac_core.h"
Chris@39 54 #endif
Chris@39 55
Chris@39 56 #define NUM_SECONDS (5)
Chris@39 57 #define SAMPLE_RATE (44100)
Chris@39 58 #define FRAMES_PER_BUFFER (64)
Chris@39 59
Chris@39 60 #ifndef M_PI
Chris@39 61 #define M_PI (3.14159265)
Chris@39 62 #endif
Chris@39 63
Chris@39 64 #define TABLE_SIZE (200)
Chris@39 65 typedef struct
Chris@39 66 {
Chris@39 67 float sine[TABLE_SIZE];
Chris@39 68 int left_phase;
Chris@39 69 int right_phase;
Chris@39 70 }
Chris@39 71 paTestData;
Chris@39 72
Chris@39 73 /* This routine will be called by the PortAudio engine when audio is needed.
Chris@39 74 ** It may called at interrupt level on some machines so don't do anything
Chris@39 75 ** that could mess up the system like calling malloc() or free().
Chris@39 76 */
Chris@39 77 static int patestCallback( const void *inputBuffer, void *outputBuffer,
Chris@39 78 unsigned long framesPerBuffer,
Chris@39 79 const PaStreamCallbackTimeInfo* timeInfo,
Chris@39 80 PaStreamCallbackFlags statusFlags,
Chris@39 81 void *userData )
Chris@39 82 {
Chris@39 83 paTestData *data = (paTestData*)userData;
Chris@39 84 float *out = (float*)outputBuffer;
Chris@39 85 unsigned long i;
Chris@39 86
Chris@39 87 (void) timeInfo; /* Prevent unused variable warnings. */
Chris@39 88 (void) statusFlags;
Chris@39 89 (void) inputBuffer;
Chris@39 90
Chris@39 91 for( i=0; i<framesPerBuffer; i++ )
Chris@39 92 {
Chris@39 93 *out++ = data->sine[data->left_phase]; /* left */
Chris@39 94 *out++ = data->sine[data->right_phase]; /* right */
Chris@39 95 data->left_phase += 1;
Chris@39 96 if( data->left_phase >= TABLE_SIZE ) data->left_phase -= TABLE_SIZE;
Chris@39 97 data->right_phase += 3; /* higher pitch so we can distinguish left and right. */
Chris@39 98 if( data->right_phase >= TABLE_SIZE ) data->right_phase -= TABLE_SIZE;
Chris@39 99 }
Chris@39 100
Chris@39 101 return paContinue;
Chris@39 102 }
Chris@39 103
Chris@39 104 /*******************************************************************/
Chris@39 105 int main(void);
Chris@39 106 int main(void)
Chris@39 107 {
Chris@39 108 PaStreamParameters outputParameters;
Chris@39 109 PaStream *stream;
Chris@39 110 PaError err;
Chris@39 111 paTestData data;
Chris@39 112 #ifdef __APPLE__
Chris@39 113 PaMacCoreStreamInfo macInfo;
Chris@39 114 const SInt32 channelMap[4] = { -1, -1, 0, 1 };
Chris@39 115 #endif
Chris@39 116 int i;
Chris@39 117
Chris@39 118
Chris@39 119 printf("PortAudio Test: output sine wave. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER);
Chris@39 120 printf("Output will be mapped to channels 2 and 3 instead of 0 and 1.\n");
Chris@39 121
Chris@39 122 /* initialise sinusoidal wavetable */
Chris@39 123 for( i=0; i<TABLE_SIZE; i++ )
Chris@39 124 {
Chris@39 125 data.sine[i] = (float) sin( ((double)i/(double)TABLE_SIZE) * M_PI * 2. );
Chris@39 126 }
Chris@39 127 data.left_phase = data.right_phase = 0;
Chris@39 128
Chris@39 129 err = Pa_Initialize();
Chris@39 130 if( err != paNoError ) goto error;
Chris@39 131
Chris@39 132 /** setup host specific info */
Chris@39 133 #ifdef __APPLE__
Chris@39 134 PaMacCore_SetupStreamInfo( &macInfo, paMacCorePlayNice );
Chris@39 135 PaMacCore_SetupChannelMap( &macInfo, channelMap, 4 );
Chris@39 136
Chris@39 137 for( i=0; i<4; ++i )
Chris@39 138 printf( "channel %d name: %s\n", i, PaMacCore_GetChannelName( Pa_GetDefaultOutputDevice(), i, false ) );
Chris@39 139 #else
Chris@39 140 printf( "Channel mapping not supported on this platform. Reverting to normal sine test.\n" );
Chris@39 141 #endif
Chris@39 142
Chris@39 143 outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */
Chris@39 144 if (outputParameters.device == paNoDevice) {
Chris@39 145 fprintf(stderr,"Error: No default output device.\n");
Chris@39 146 goto error;
Chris@39 147 }
Chris@39 148 outputParameters.channelCount = 2; /* stereo output */
Chris@39 149 outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */
Chris@39 150 outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency;
Chris@39 151 #ifdef __APPLE__
Chris@39 152 outputParameters.hostApiSpecificStreamInfo = &macInfo;
Chris@39 153 #else
Chris@39 154 outputParameters.hostApiSpecificStreamInfo = NULL;
Chris@39 155 #endif
Chris@39 156
Chris@39 157 err = Pa_OpenStream(
Chris@39 158 &stream,
Chris@39 159 NULL, /* no input */
Chris@39 160 &outputParameters,
Chris@39 161 SAMPLE_RATE,
Chris@39 162 FRAMES_PER_BUFFER,
Chris@39 163 paClipOff, /* we won't output out of range samples so don't bother clipping them */
Chris@39 164 patestCallback,
Chris@39 165 &data );
Chris@39 166 if( err != paNoError ) goto error;
Chris@39 167
Chris@39 168 err = Pa_StartStream( stream );
Chris@39 169 if( err != paNoError ) goto error;
Chris@39 170
Chris@39 171 printf("Play for %d seconds.\n", NUM_SECONDS );
Chris@39 172 Pa_Sleep( NUM_SECONDS * 1000 );
Chris@39 173
Chris@39 174 err = Pa_StopStream( stream );
Chris@39 175 if( err != paNoError ) goto error;
Chris@39 176
Chris@39 177 err = Pa_CloseStream( stream );
Chris@39 178 if( err != paNoError ) goto error;
Chris@39 179
Chris@39 180 Pa_Terminate();
Chris@39 181 printf("Test finished.\n");
Chris@39 182
Chris@39 183 return err;
Chris@39 184 error:
Chris@39 185 Pa_Terminate();
Chris@39 186 fprintf( stderr, "An error occured while using the portaudio stream\n" );
Chris@39 187 fprintf( stderr, "Error number: %d\n", err );
Chris@39 188 fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
Chris@39 189 return err;
Chris@39 190 }