annotate src/portaudio_20161030_catalina_patch/examples/pa_fuzz.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 4edcd14160a5
children
rev   line source
Chris@4 1 /** @file pa_fuzz.c
Chris@4 2 @ingroup examples_src
Chris@4 3 @brief Distort input like a fuzz box.
Chris@4 4 @author Phil Burk http://www.softsynth.com
Chris@4 5 */
Chris@4 6 /*
Chris@55 7 * $Id$
Chris@4 8 *
Chris@4 9 * This program uses the PortAudio Portable Audio Library.
Chris@4 10 * For more information see: http://www.portaudio.com
Chris@4 11 * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
Chris@4 12 *
Chris@4 13 * Permission is hereby granted, free of charge, to any person obtaining
Chris@4 14 * a copy of this software and associated documentation files
Chris@4 15 * (the "Software"), to deal in the Software without restriction,
Chris@4 16 * including without limitation the rights to use, copy, modify, merge,
Chris@4 17 * publish, distribute, sublicense, and/or sell copies of the Software,
Chris@4 18 * and to permit persons to whom the Software is furnished to do so,
Chris@4 19 * subject to the following conditions:
Chris@4 20 *
Chris@4 21 * The above copyright notice and this permission notice shall be
Chris@4 22 * included in all copies or substantial portions of the Software.
Chris@4 23 *
Chris@4 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Chris@4 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Chris@4 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Chris@4 27 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
Chris@4 28 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
Chris@4 29 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
Chris@4 30 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Chris@4 31 */
Chris@4 32
Chris@4 33 /*
Chris@4 34 * The text above constitutes the entire PortAudio license; however,
Chris@4 35 * the PortAudio community also makes the following non-binding requests:
Chris@4 36 *
Chris@4 37 * Any person wishing to distribute modifications to the Software is
Chris@4 38 * requested to send the modifications to the original developer so that
Chris@4 39 * they can be incorporated into the canonical version. It is also
Chris@4 40 * requested that these non-binding requests be included along with the
Chris@4 41 * license above.
Chris@4 42 */
Chris@4 43
Chris@4 44 #include <stdio.h>
Chris@4 45 #include <math.h>
Chris@4 46 #include "portaudio.h"
Chris@4 47 /*
Chris@4 48 ** Note that many of the older ISA sound cards on PCs do NOT support
Chris@4 49 ** full duplex audio (simultaneous record and playback).
Chris@4 50 ** And some only support full duplex at lower sample rates.
Chris@4 51 */
Chris@4 52 #define SAMPLE_RATE (44100)
Chris@4 53 #define PA_SAMPLE_TYPE paFloat32
Chris@4 54 #define FRAMES_PER_BUFFER (64)
Chris@4 55
Chris@4 56 typedef float SAMPLE;
Chris@4 57
Chris@4 58 float CubicAmplifier( float input );
Chris@4 59 static int fuzzCallback( const void *inputBuffer, void *outputBuffer,
Chris@4 60 unsigned long framesPerBuffer,
Chris@4 61 const PaStreamCallbackTimeInfo* timeInfo,
Chris@4 62 PaStreamCallbackFlags statusFlags,
Chris@4 63 void *userData );
Chris@4 64
Chris@4 65 /* Non-linear amplifier with soft distortion curve. */
Chris@4 66 float CubicAmplifier( float input )
Chris@4 67 {
Chris@4 68 float output, temp;
Chris@4 69 if( input < 0.0 )
Chris@4 70 {
Chris@4 71 temp = input + 1.0f;
Chris@4 72 output = (temp * temp * temp) - 1.0f;
Chris@4 73 }
Chris@4 74 else
Chris@4 75 {
Chris@4 76 temp = input - 1.0f;
Chris@4 77 output = (temp * temp * temp) + 1.0f;
Chris@4 78 }
Chris@4 79
Chris@4 80 return output;
Chris@4 81 }
Chris@4 82 #define FUZZ(x) CubicAmplifier(CubicAmplifier(CubicAmplifier(CubicAmplifier(x))))
Chris@4 83
Chris@4 84 static int gNumNoInputs = 0;
Chris@4 85 /* This routine will be called by the PortAudio engine when audio is needed.
Chris@4 86 ** It may be called at interrupt level on some machines so don't do anything
Chris@4 87 ** that could mess up the system like calling malloc() or free().
Chris@4 88 */
Chris@4 89 static int fuzzCallback( const void *inputBuffer, void *outputBuffer,
Chris@4 90 unsigned long framesPerBuffer,
Chris@4 91 const PaStreamCallbackTimeInfo* timeInfo,
Chris@4 92 PaStreamCallbackFlags statusFlags,
Chris@4 93 void *userData )
Chris@4 94 {
Chris@4 95 SAMPLE *out = (SAMPLE*)outputBuffer;
Chris@4 96 const SAMPLE *in = (const SAMPLE*)inputBuffer;
Chris@4 97 unsigned int i;
Chris@4 98 (void) timeInfo; /* Prevent unused variable warnings. */
Chris@4 99 (void) statusFlags;
Chris@4 100 (void) userData;
Chris@4 101
Chris@4 102 if( inputBuffer == NULL )
Chris@4 103 {
Chris@4 104 for( i=0; i<framesPerBuffer; i++ )
Chris@4 105 {
Chris@4 106 *out++ = 0; /* left - silent */
Chris@4 107 *out++ = 0; /* right - silent */
Chris@4 108 }
Chris@4 109 gNumNoInputs += 1;
Chris@4 110 }
Chris@4 111 else
Chris@4 112 {
Chris@4 113 for( i=0; i<framesPerBuffer; i++ )
Chris@4 114 {
Chris@4 115 *out++ = FUZZ(*in++); /* left - distorted */
Chris@4 116 *out++ = *in++; /* right - clean */
Chris@4 117 }
Chris@4 118 }
Chris@4 119
Chris@4 120 return paContinue;
Chris@4 121 }
Chris@4 122
Chris@4 123 /*******************************************************************/
Chris@4 124 int main(void);
Chris@4 125 int main(void)
Chris@4 126 {
Chris@4 127 PaStreamParameters inputParameters, outputParameters;
Chris@4 128 PaStream *stream;
Chris@4 129 PaError err;
Chris@4 130
Chris@4 131 err = Pa_Initialize();
Chris@4 132 if( err != paNoError ) goto error;
Chris@4 133
Chris@4 134 inputParameters.device = Pa_GetDefaultInputDevice(); /* default input device */
Chris@4 135 if (inputParameters.device == paNoDevice) {
Chris@4 136 fprintf(stderr,"Error: No default input device.\n");
Chris@4 137 goto error;
Chris@4 138 }
Chris@4 139 inputParameters.channelCount = 2; /* stereo input */
Chris@4 140 inputParameters.sampleFormat = PA_SAMPLE_TYPE;
Chris@4 141 inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputParameters.device )->defaultLowInputLatency;
Chris@4 142 inputParameters.hostApiSpecificStreamInfo = NULL;
Chris@4 143
Chris@4 144 outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */
Chris@4 145 if (outputParameters.device == paNoDevice) {
Chris@4 146 fprintf(stderr,"Error: No default output device.\n");
Chris@4 147 goto error;
Chris@4 148 }
Chris@4 149 outputParameters.channelCount = 2; /* stereo output */
Chris@4 150 outputParameters.sampleFormat = PA_SAMPLE_TYPE;
Chris@4 151 outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency;
Chris@4 152 outputParameters.hostApiSpecificStreamInfo = NULL;
Chris@4 153
Chris@4 154 err = Pa_OpenStream(
Chris@4 155 &stream,
Chris@4 156 &inputParameters,
Chris@4 157 &outputParameters,
Chris@4 158 SAMPLE_RATE,
Chris@4 159 FRAMES_PER_BUFFER,
Chris@4 160 0, /* paClipOff, */ /* we won't output out of range samples so don't bother clipping them */
Chris@4 161 fuzzCallback,
Chris@4 162 NULL );
Chris@4 163 if( err != paNoError ) goto error;
Chris@4 164
Chris@4 165 err = Pa_StartStream( stream );
Chris@4 166 if( err != paNoError ) goto error;
Chris@4 167
Chris@4 168 printf("Hit ENTER to stop program.\n");
Chris@4 169 getchar();
Chris@4 170 err = Pa_CloseStream( stream );
Chris@4 171 if( err != paNoError ) goto error;
Chris@4 172
Chris@4 173 printf("Finished. gNumNoInputs = %d\n", gNumNoInputs );
Chris@4 174 Pa_Terminate();
Chris@4 175 return 0;
Chris@4 176
Chris@4 177 error:
Chris@4 178 Pa_Terminate();
Chris@4 179 fprintf( stderr, "An error occured while using the portaudio stream\n" );
Chris@4 180 fprintf( stderr, "Error number: %d\n", err );
Chris@4 181 fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
Chris@4 182 return -1;
Chris@4 183 }