void Audio::closeInputDevice() { if (!adc.isStreamOpen()) return; adc.stopStream(); while (adc.isStreamRunning()); adc.closeStream(); }
void av_audio_start() { av_audio_get(); if (rta.isStreamRunning()) { rta.stopStream(); } if (rta.isStreamOpen()) { // close it: rta.closeStream(); } unsigned int devices = rta.getDeviceCount(); if (devices < 1) { printf("No audio devices found\n"); return; } RtAudio::DeviceInfo info; RtAudio::StreamParameters iParams, oParams; printf("Available audio devices (%d):\n", devices); for (unsigned int i=0; i<devices; i++) { info = rta.getDeviceInfo(i); printf("Device %d: %dx%d (%d) %s\n", i, info.inputChannels, info.outputChannels, info.duplexChannels, info.name.c_str()); } printf("device %d\n", audio.indevice); info = rta.getDeviceInfo(audio.indevice); printf("Using audio input %d: %dx%d (%d) %s\n", audio.indevice, info.inputChannels, info.outputChannels, info.duplexChannels, info.name.c_str()); audio.inchannels = info.inputChannels; iParams.deviceId = audio.indevice; iParams.nChannels = audio.inchannels; iParams.firstChannel = 0; info = rta.getDeviceInfo(audio.outdevice); printf("Using audio output %d: %dx%d (%d) %s\n", audio.outdevice, info.inputChannels, info.outputChannels, info.duplexChannels, info.name.c_str()); audio.outchannels = info.outputChannels; oParams.deviceId = audio.outdevice; oParams.nChannels = audio.outchannels; oParams.firstChannel = 0; RtAudio::StreamOptions options; //options.flags |= RTAUDIO_NONINTERLEAVED; options.streamName = "av"; try { rta.openStream( &oParams, &iParams, RTAUDIO_FLOAT32, audio.samplerate, &audio.blocksize, &av_rtaudio_callback, NULL, &options ); rta.startStream(); printf("Audio started\n"); } catch ( RtError& e ) { fprintf(stderr, "%s\n", e.getMessage().c_str()); } }
void Audio::closeOutputDevice() { if (!dac.isStreamOpen()) return; dac.stopStream(); while (dac.isStreamRunning()); dac.closeStream(); outIsOpened = false; }
int main( int argc, char *argv[] ) { unsigned int channels, fs, bufferFrames, device = 0, offset = 0; char *file; // minimal command-line checking if ( argc < 4 || argc > 6 ) usage(); RtAudio dac; if ( dac.getDeviceCount() < 1 ) { std::cout << "\nNo audio devices found!\n"; exit( 0 ); } channels = (unsigned int) atoi( argv[1]) ; fs = (unsigned int) atoi( argv[2] ); file = argv[3]; if ( argc > 4 ) device = (unsigned int) atoi( argv[4] ); if ( argc > 5 ) offset = (unsigned int) atoi( argv[5] ); OutputData data; data.fd = fopen( file, "rb" ); if ( !data.fd ) { std::cout << "Unable to find or open file!\n"; exit( 1 ); } // Set our stream parameters for output only. bufferFrames = 512; RtAudio::StreamParameters oParams; oParams.deviceId = device; oParams.nChannels = channels; oParams.firstChannel = offset; data.channels = channels; try { dac.openStream( &oParams, NULL, FORMAT, fs, &bufferFrames, &output, (void *)&data ); dac.startStream(); } catch ( RtError& e ) { std::cout << '\n' << e.getMessage() << '\n' << std::endl; goto cleanup; } std::cout << "\nPlaying raw file " << file << " (buffer frames = " << bufferFrames << ")." << std::endl; while ( 1 ) { SLEEP( 100 ); // wake every 100 ms to check if we're done if ( dac.isStreamRunning() == false ) break; } cleanup: fclose( data.fd ); dac.closeStream(); return 0; }
int main( int argc, char *argv[] ) { unsigned int bufferFrames, fs, device = 0, offset = 0; // minimal command-line checking if (argc < 3 || argc > 6 ) usage(); RtAudio dac; if ( dac.getDeviceCount() < 1 ) { std::cout << "\nNo audio devices found!\n"; exit( 1 ); } channels = (unsigned int) atoi( argv[1] ); fs = (unsigned int) atoi( argv[2] ); if ( argc > 3 ) device = (unsigned int) atoi( argv[3] ); if ( argc > 4 ) offset = (unsigned int) atoi( argv[4] ); if ( argc > 5 ) nFrames = (unsigned int) (fs * atof( argv[5] )); if ( nFrames > 0 ) checkCount = true; double *data = (double *) calloc( channels, sizeof( double ) ); // Let RtAudio print messages to stderr. dac.showWarnings( true ); // Set our stream parameters for output only. bufferFrames = 256; RtAudio::StreamParameters oParams; oParams.deviceId = device; oParams.nChannels = channels; oParams.firstChannel = offset; options.flags |= RTAUDIO_HOG_DEVICE; options.flags |= RTAUDIO_SCHEDULE_REALTIME; #if !defined( USE_INTERLEAVED ) options.flags |= RTAUDIO_NONINTERLEAVED; #endif try { dac.openStream( &oParams, NULL, FORMAT, fs, &bufferFrames, &saw, (void *)data, &options ); dac.startStream(); } catch ( RtError& e ) { e.printMessage(); goto cleanup; } if ( checkCount ) { while ( dac.isStreamRunning() == true ) SLEEP( 100 ); } else { char input; //std::cout << "Stream latency = " << dac.getStreamLatency() << "\n" << std::endl; std::cout << "\nPlaying ... press <enter> to quit (buffer size = " << bufferFrames << ").\n"; std::cin.get( input ); try { // Stop the stream dac.stopStream(); } catch ( RtError& e ) { e.printMessage(); } } cleanup: if ( dac.isStreamOpen() ) dac.closeStream(); free( data ); return 0; }
int main( int argc, char *argv[] ) { unsigned int channels, fs, bufferFrames, device = 0, offset = 0; double time = 2.0; FILE *fd; // minimal command-line checking if ( argc < 3 || argc > 6 ) usage(); RtAudio adc; if ( adc.getDeviceCount() < 1 ) { std::cout << "\nNo audio devices found!\n"; exit( 1 ); } channels = (unsigned int) atoi( argv[1] ); fs = (unsigned int) atoi( argv[2] ); if ( argc > 3 ) time = (double) atof( argv[3] ); if ( argc > 4 ) device = (unsigned int) atoi( argv[4] ); if ( argc > 5 ) offset = (unsigned int) atoi( argv[5] ); // Let RtAudio print messages to stderr. adc.showWarnings( true ); // Set our stream parameters for input only. bufferFrames = 512; RtAudio::StreamParameters iParams; iParams.deviceId = device; iParams.nChannels = channels; iParams.firstChannel = offset; InputData data; data.buffer = 0; try { adc.openStream( NULL, &iParams, FORMAT, fs, &bufferFrames, &input, (void *)&data ); } catch ( RtError& e ) { std::cout << '\n' << e.getMessage() << '\n' << std::endl; goto cleanup; } data.bufferBytes = bufferFrames * channels * sizeof( MY_TYPE ); data.totalFrames = (unsigned long) (fs * time); data.frameCounter = 0; data.channels = channels; unsigned long totalBytes; totalBytes = data.totalFrames * channels * sizeof( MY_TYPE ); // Allocate the entire data buffer before starting stream. data.buffer = (MY_TYPE*) malloc( totalBytes ); if ( data.buffer == 0 ) { std::cout << "Memory allocation error ... quitting!\n"; goto cleanup; } try { adc.startStream(); } catch ( RtError& e ) { std::cout << '\n' << e.getMessage() << '\n' << std::endl; goto cleanup; } std::cout << "\nRecording for " << time << " seconds ... writing file 'record.raw' (buffer frames = " << bufferFrames << ")." << std::endl; while ( adc.isStreamRunning() ) { SLEEP( 100 ); // wake every 100 ms to check if we're done } // Now write the entire data to the file. fd = fopen( "record.raw", "wb" ); fwrite( data.buffer, sizeof( MY_TYPE ), data.totalFrames * channels, fd ); fclose( fd ); cleanup: if ( adc.isStreamOpen() ) adc.closeStream(); if ( data.buffer ) free( data.buffer ); return 0; }