static int TestBadActions( void ) { PortAudioStream *stream = NULL; PaError result; PaQaData myData; /* Setup data for synthesis thread. */ myData.framesLeft = (unsigned long) (SAMPLE_RATE * 100); /* 100 seconds */ myData.numChannels = 1; myData.mode = MODE_OUTPUT; /* Default output. */ EXPECT( "TestBadActions", ((result = Pa_OpenStream( &stream, paNoDevice, 0, paFloat32, NULL, Pa_GetDefaultOutputDeviceID(), 2, paFloat32, NULL, SAMPLE_RATE, FRAMES_PER_BUFFER, NUM_BUFFERS, paClipOff, QaCallback, &myData ) ) == 0) ); HOPEFOR( "start", ((result = Pa_StartStream( NULL )) == paBadStreamPtr) ); HOPEFOR( "stop", ((result = Pa_StopStream( NULL )) == paBadStreamPtr) ); HOPEFOR( "active?", ((result = Pa_StreamActive( NULL )) == paBadStreamPtr) ); HOPEFOR( "close", ((result = Pa_CloseStream( NULL )) == paBadStreamPtr) ); HOPEFOR( "time?", ((result = (PaError)Pa_StreamTime( NULL )) != 0) ); HOPEFOR( "CPULoad?", ((result = (PaError)Pa_GetCPULoad( NULL )) != 0) ); error: if( stream != NULL ) Pa_CloseStream( stream ); return result; }
double AudioIO::GetIndicator() { if (mProject && mPortStream) return mT0 + (Pa_StreamTime(mPortStream)/ mRate); else return -1000000000.0; }
void CPortAudioSync::audio_callback(void *stream, unsigned long len, PaTimestamp outtime) { uint64_t our_time; uint32_t outBufferTotalBytes = len * m_bytes_per_sample_output; our_time = get_time_of_day_usec(); PaTimestamp realtime = Pa_StreamTime(m_pa_stream); uint64_t delay = (uint64_t)(outtime - realtime); audio_buffer_callback((uint8_t *)stream, outBufferTotalBytes, delay, our_time); }
void TPortAudioRenderer::GetInfo(RendererInfoPtr info) { info->fInput = fInput; info->fOutput = fOutput; info->fSampleRate = fSampleRate; info->fBufferSize = fBufferSize; info->fCurFrame = long(Pa_StreamTime(fStream)); info->fCurMs = ConvertSample2Ms(info->fCurFrame); #if defined(WIN32) && defined(IMUTUS) info->fOutputLatencyFrame = Pa_GetOutputLatency(fStream); info->fOutputLatencyMs = ConvertSample2Ms(info->fOutputLatencyFrame); #else info->fOutputLatencyFrame = 0; info->fOutputLatencyMs = 0; #endif }
////////////////////// // PortAudio callback int PortAudioPlayer::paCallback(void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, PaTimestamp outTime, void *userData) { // Get provider PortAudioPlayer *player = (PortAudioPlayer *) userData; AudioProvider *provider = player->GetProvider(); int end = 0; // Calculate how much left __int64 lenAvailable = player->endPos - player->playPos; uint64_t avail = 0; if (lenAvailable > 0) { avail = lenAvailable; if (avail > framesPerBuffer) { lenAvailable = framesPerBuffer; avail = lenAvailable; } } else { lenAvailable = 0; avail = 0; } // Play something if (lenAvailable > 0) { provider->GetAudio(outputBuffer,player->playPos,lenAvailable); } // Pad end with blank if (avail < (uint64_t) framesPerBuffer) { //provider->softStop = true; } // Set volume short *output = (short*) outputBuffer; for (unsigned int i=0;i<avail;i++) output[i] = MID(-(1<<15),int(output[i] * player->GetVolume()),(1<<15)-1); // Fill rest with blank for (unsigned int i=avail;i<framesPerBuffer;i++) output[i]=0; // Set play position (and real one) player->playPos += framesPerBuffer; player->realPlayPos = (__int64)(Pa_StreamTime(player->stream) - player->paStart) + player->startPos; // Cap to start if lower return end; }
static void ReportStreamTime( PortAudioStream *stream, paTestData *data ) { PaTimestamp streamTime, latency, outTime; streamTime = Pa_StreamTime( stream ); outTime = data->outTime; if( outTime < 0.0 ) { printf("Stream time = %8.1f\n", streamTime ); } else { latency = outTime - streamTime; printf("Stream time = %8.1f, outTime = %8.1f, latency = %8.1f\n", streamTime, outTime, latency ); } fflush(stdout); }
//////// // Play void PortAudioPlayer::Play(__int64 start,__int64 count) { // Stop if it's already playing wxMutexLocker locker(PAMutex); // Set values endPos = start + count; playPos = start; realPlayPos = start; startPos = start; // Start playing if (!playing) { PaError err = Pa_StartStream(stream); if (err != paNoError) { return; } } playing = true; paStart = Pa_StreamTime(stream); // Update timer if (displayTimer && !displayTimer->IsRunning()) displayTimer->Start(15); }
int main(void) { PortAudioStream *stream; PaError err; paTestData DATA; int i; int totalSamps; 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; DATA.framesToGo = totalSamps = NUM_SECONDS * SAMPLE_RATE; /* Play for a few seconds. */ err = Pa_Initialize(); if( err != paNoError ) goto error; err = Pa_OpenStream( &stream, paNoDevice,/* default input device */ 0, /* no input */ paFloat32, /* 32 bit floating point input */ NULL, Pa_GetDefaultOutputDeviceID(), /* default output device */ 2, /* stereo output */ paFloat32, /* 32 bit floating point output */ NULL, SAMPLE_RATE, FRAMES_PER_BUFFER, /* frames per buffer */ NUM_BUFFERS, /* number of buffers, if zero then use default minimum */ paClipOff, /* we won't output out of range samples so don't bother clipping them */ patestCallback, &DATA ); if( err != paNoError ) goto error; DATA.outTime = -1.0; // mark time for callback as undefined err = Pa_StartStream( stream ); if( err != paNoError ) goto error; /* Watch until sound is halfway finished. */ printf("Play for %d seconds.\n", NUM_SECONDS/2 ); fflush(stdout); do { ReportStreamTime( stream, &DATA ); Pa_Sleep(100); } while( Pa_StreamTime( stream ) < (totalSamps/2) ); /* Stop sound until ENTER hit. */ err = Pa_StopStream( stream ); if( err != paNoError ) goto error; printf("Pause for 2 seconds.\n"); fflush(stdout); Pa_Sleep( 2000 ); DATA.outTime = -1.0; // mark time for callback as undefined err = Pa_StartStream( stream ); if( err != paNoError ) goto error; printf("Play until sound is finished.\n"); fflush(stdout); do { ReportStreamTime( stream, &DATA ); Pa_Sleep(100); } while( Pa_StreamActive( stream ) ); err = Pa_CloseStream( stream ); if( err != paNoError ) goto error; Pa_Terminate(); printf("Test finished.\n"); return err; error: Pa_Terminate(); fprintf( stderr, "An error occured while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; }
int main(void) { PortAudioStream *stream; PaError err; paTestData data; int i; int totalSamps; #if TEST_UNSIGNED printf("PortAudio Test: output UNsigned 8 bit sine wave.\n"); #else printf("PortAudio Test: output signed 8 bit sine wave.\n"); #endif /* initialise sinusoidal wavetable */ for( i=0; i<TABLE_SIZE; i++ ) { data.sine[i] = (char) (127.0 * sin( ((double)i/(double)TABLE_SIZE) * M_PI * 2. )); #if TEST_UNSIGNED data.sine[i] += (unsigned char) 0x80; #endif } data.left_phase = data.right_phase = 0; data.framesToGo = totalSamps = NUM_SECONDS * SAMPLE_RATE; /* Play for a few seconds. */ err = Pa_Initialize(); if( err != paNoError ) goto error; err = Pa_OpenStream( &stream, paNoDevice,/* default input device */ 0, /* no input */ TEST_FORMAT, NULL, Pa_GetDefaultOutputDeviceID(), /* default output device */ 2, /* stereo output */ TEST_FORMAT, NULL, SAMPLE_RATE, 256, /* frames per buffer */ 0, /* number of buffers, if zero then use default minimum */ 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; /* Watch until sound is halfway finished. */ while( Pa_StreamTime( stream ) < (totalSamps/2) ) Pa_Sleep(10); /* Stop sound until ENTER hit. */ err = Pa_StopStream( stream ); if( err != paNoError ) goto error; printf("Pause for 2 seconds.\n"); Pa_Sleep( 2000 ); err = Pa_StartStream( stream ); if( err != paNoError ) goto error; printf("Waiting for sound to finish.\n"); while( Pa_StreamActive( stream ) ) Pa_Sleep(10); err = Pa_CloseStream( stream ); if( err != paNoError ) goto error; Pa_Terminate(); printf("Test finished.\n"); return err; error: Pa_Terminate(); fprintf( stderr, "An error occured while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; }
static int TestAdvance( int mode, PaDeviceID deviceID, double sampleRate, int numChannels, PaSampleFormat format ) { PortAudioStream *stream = NULL; PaError result; PaQaData myData; #define FRAMES_PER_BUFFER (64) printf("------ TestAdvance: %s, device = %d, rate = %g, numChannels = %d, format = %d -------\n", ( mode == MODE_INPUT ) ? "INPUT" : "OUTPUT", deviceID, sampleRate, numChannels, format); fflush(stdout); /* Setup data for synthesis thread. */ myData.framesLeft = (unsigned long) (sampleRate * 100); /* 100 seconds */ myData.numChannels = numChannels; myData.mode = mode; myData.format = format; switch( format ) { case paFloat32: case paInt32: case paInt24: myData.bytesPerSample = 4; break; case paPackedInt24: myData.bytesPerSample = 3; break; default: myData.bytesPerSample = 2; break; } EXPECT( ((result = Pa_OpenStream( &stream, ( mode == MODE_INPUT ) ? deviceID : paNoDevice, ( mode == MODE_INPUT ) ? numChannels : 0, format, NULL, ( mode == MODE_OUTPUT ) ? deviceID : paNoDevice, ( mode == MODE_OUTPUT ) ? numChannels : 0, format, NULL, sampleRate, FRAMES_PER_BUFFER, /* frames per buffer */ 0, /* number of buffers, if zero then use default minimum */ paClipOff, /* we won't output out of range samples so don't bother clipping them */ QaCallback, &myData ) ) == 0) ); if( stream ) { PaTimestamp oldStamp, newStamp; unsigned long oldFrames; int minDelay = ( mode == MODE_INPUT ) ? 1000 : 400; int minNumBuffers = Pa_GetMinNumBuffers( FRAMES_PER_BUFFER, sampleRate ); int msec = (int) ((minNumBuffers * 3 * 1000.0 * FRAMES_PER_BUFFER) / sampleRate); if( msec < minDelay ) msec = minDelay; printf("msec = %d\n", msec); /**/ EXPECT( ((result=Pa_StartStream( stream )) == 0) ); /* Check to make sure PortAudio is advancing timeStamp. */ result = paNoError; oldStamp = Pa_StreamTime(stream); fflush(stdout); Pa_Sleep(msec); newStamp = Pa_StreamTime(stream); printf("oldStamp = %g,newStamp = %g\n", oldStamp, newStamp ); /**/ EXPECT( (oldStamp < newStamp) ); /* Check to make sure callback is decrementing framesLeft. */ oldFrames = myData.framesLeft; Pa_Sleep(msec); printf("oldFrames = %d, myData.framesLeft = %d\n", oldFrames, myData.framesLeft ); /**/ EXPECT( (oldFrames > myData.framesLeft) ); EXPECT( ((result=Pa_CloseStream( stream )) == 0) ); stream = NULL; } error: if( stream != NULL ) Pa_CloseStream( stream ); fflush(stdout); return result; }
PaTimestamp GetAudioStreamTime( PASTREAMIO_Stream *aStream ){ return Pa_StreamTime( aStream->stream ) ; }