mirror of
https://github.com/thestk/stk
synced 2026-01-11 20:11:52 +00:00
94 lines
2.5 KiB
C++
94 lines
2.5 KiB
C++
/******************************************/
|
|
/*
|
|
Example program for realtime input/output
|
|
by Gary P. Scavone, 2000
|
|
|
|
This program reads N channels of realtime
|
|
audio input for a specified amount of time
|
|
and immediately play them back in realtime
|
|
(duplex mode). This program also demonstrates
|
|
the use of FIFO scheduling priority. To be
|
|
run with such priority, the program must be
|
|
set suid (chmod +s) and owned by root.
|
|
*/
|
|
/******************************************/
|
|
|
|
#include "RtDuplex.h"
|
|
#include <stdio.h>
|
|
|
|
#if defined(__OS_LINUX__) || defined(__OS_IRIX__)
|
|
#include <unistd.h>
|
|
#include <sched.h>
|
|
#endif
|
|
|
|
void usage(void) {
|
|
// Error function in case of incorrect command-line
|
|
// argument specifications.
|
|
printf("\nuseage: io N time \n");
|
|
printf(" where N = number of channels,\n");
|
|
printf(" and time = the amount of time to run (in seconds).\n\n");
|
|
exit(0);
|
|
}
|
|
|
|
int
|
|
main(int argc, char *argv[])
|
|
{
|
|
// Minimal command-line checking.
|
|
if (argc != 3) usage();
|
|
|
|
unsigned int channels = (unsigned int) atoi(argv[1]);
|
|
float time = atof(argv[2]);
|
|
|
|
// If you want to change the default sample rate (set in Stk.h), do
|
|
// it before instantiating any objects! If the sample rate is
|
|
// specified in the command line, it will override this setting.
|
|
Stk::setSampleRate( 44100.0 );
|
|
|
|
// Open the realtime duplex device.
|
|
RtDuplex *inout = 0;
|
|
try {
|
|
inout = new RtDuplex(channels, Stk::sampleRate(), 0, RT_BUFFER_SIZE, 10);
|
|
}
|
|
catch (StkError &) {
|
|
exit(0);
|
|
}
|
|
|
|
#if defined(__OS_LINUX__) || defined(__OS_IRIX__)
|
|
// Set schedulling priority to SCHED_FIFO.
|
|
struct sched_param p;
|
|
int min, max, priority;
|
|
|
|
if (!getuid() || !geteuid()) {
|
|
min=sched_get_priority_min(SCHED_FIFO);
|
|
max=sched_get_priority_max(SCHED_FIFO);
|
|
priority=min+(max-min)/2;
|
|
p.sched_priority=priority;
|
|
if (sched_setscheduler(0, SCHED_FIFO, &p)==-1) {
|
|
fprintf(stderr, "\nCould not activate scheduling with priority %d\n", priority);
|
|
}
|
|
seteuid(getuid());
|
|
}
|
|
#endif
|
|
|
|
// Here's the runtime loop
|
|
unsigned long i, counter = 0;
|
|
MY_FLOAT *newFrame = new MY_FLOAT[channels];
|
|
const MY_FLOAT *lastFrame = inout->lastFrame();
|
|
unsigned long samples = (unsigned long) (time * Stk::sampleRate());
|
|
while ( counter < samples ) {
|
|
for ( i=0; i<channels; i++ )
|
|
newFrame[i] = lastFrame[i];
|
|
lastFrame = inout->tickFrame( newFrame );
|
|
counter++;
|
|
#if defined(__OS_LINUX__) || defined(__OS_IRIX__)
|
|
if ( counter % 1024 == 0 )
|
|
sched_yield();
|
|
#endif
|
|
}
|
|
|
|
// Clean up
|
|
delete [] newFrame;
|
|
delete inout;
|
|
return 0;
|
|
}
|