Thread View: psu.next
1 messages
1 total messages
Started by Charles Hannum
Tue, 27 Mar 1990 23:10
Real-time recording and playback of sound
Author: Charles Hannum
Date: Tue, 27 Mar 1990 23:10
Date: Tue, 27 Mar 1990 23:10
203 lines
5744 bytes
5744 bytes
I've been going crazy for the past three days. For some reason, the below
program consistently gives me errors, namely:
Timeout
Cannot access hardware resource
Cannot record sound
Now, could someone PLEASE tell me why this fails, and why the reasons for these
error codes aren't listed in the manual?
I'd appreciate email. If someone is *really* interested I can summarize, or
mail a summary.
Thanks for your help.
- Charles Hannum
cmh117@haydn.psu.edu <------ SEND MAIL HERE!!
cmh117@psuvm.psu.edu
-------8<-------snip-------8<-------snip-------8<-------snip-------8<-------
#import <cthreads.h>
#import <sound/sound.h>
#import <stdio.h>
#import <stdarg.h>
#ifndef NO_DEBUG
#define debug(x) do { printf x; fflush(stdout); } while(0)
#else
#define debug(x)
#endif
#define BUFFERS 6
#define BUFLEN 4096
char *dst, *src;
SNDSoundStruct *sound[BUFFERS];
mutex_t tag_m,
stuffed_m;
condition_t stuffed_c;
int tag = 10000,
s_in = 0,
n_in = 0,
s_out = 0,
n_out = 0,
s_num = 0;
void check(char *where, int err)
{
if (err != SND_ERR_NONE)
{
fprintf(stderr, "SNDError at %s: %s\n", where,
SNDSoundError(err));
exit(7);
}
}
int tagme(void)
{
int atag;
mutex_lock(tag_m);
atag=tag++;
mutex_unlock(tag_m);
return(atag);
}
void c_wait(char *where, condition_t c, mutex_t m)
{
debug(("wait at %s\n",where));
condition_wait(c,m);
}
void c_signal(char *where, condition_t c)
{
debug(("signal at %s\n",where));
condition_broadcast(c);
}
int checkit(SNDSoundStruct *t, int oldtag, int err)
{
check("checkit",err);
}
int played(SNDSoundStruct *t, int oldtag, int err)
{
debug(("played ot:%3d\n",oldtag));
check("played",err);
mutex_lock(stuffed_m);
--n_out;
c_signal("played",stuffed_c);
mutex_unlock(stuffed_m);
}
int play(void)
{
check("play(res)",SNDReserve(SND_ACCESS_OUT,0));
while (1)
{
debug(("play(1) si:%2d, ni:%2d, so:%2d, no:%2d, sn:%2d\n",
s_in, n_in, s_out, n_out, s_num));
mutex_lock(stuffed_m)
while (((n_out+n_in)>=BUFFERS) | (s_num<=0))
c_wait("play",stuffed_c,stuffed_m);
++n_out;
--s_num;
mutex_unlock(stuffed_m);
debug(("play(2) si:%2d, ni:%2d, so:%2d, no:%2d, sn:%2d\n",
s_in, n_in, s_out, n_out, s_num));
check("play",SNDStartPlaying(sound[s_out],tagme(),0,0,
checkit,played));
s_out++;
if (s_out>=BUFFERS)
s_out=0;
debug(("play(3) si:%2d, ni:%2d, so:%2d, no:%2d, sn:%2d\n",
s_in, n_in, s_out, n_out, s_num));
}
}
int recorded(SNDSoundStruct *t, int oldtag, int err)
{
debug(("recorded ot:%3d\n",oldtag));
check("recorded",err);
mutex_lock(stuffed_m);
--n_in;
++s_num;
c_signal("recorded",stuffed_c);
mutex_unlock(stuffed_m);
}
int record(void)
{
check("record(reserve)", SNDReserve(SND_ACCESS_IN, 0));
while (1)
{
debug(("record(1) si:%2d, ni:%2d, so:%2d, no:%2d, sn:%2d\n",
s_in, n_in, s_out, n_out, s_num));
mutex_lock(stuffed_m);
while (((n_in+n_out)>=BUFFERS) | (n_in>=(BUFFERS-2)))
c_wait("record",stuffed_c,stuffed_m);
n_in++;
mutex_unlock(stuffed_m);
debug(("record(2) si:%2d, ni:%2d, so:%2d, no:%2d, sn:%2d\n",
s_in, n_in, s_out, n_out, s_num));
check("record",SNDStartRecording(sound[s_in],tagme(),
0, 0, checkit,recorded));
s_in++;
if (s_in>=BUFFERS)
s_in=0;
debug(("record(3) si:%2d, ni:%2d, so:%2d, no:%2d, sn:%2d\n",
s_in, n_in, s_out, n_out, s_num));
}
}
int main(int argc, char **argv)
{
int i;
for (i=0; i<BUFFERS; i++)
check("main(alloc)", SNDAlloc(&sound[i], BUFLEN,
SND_FORMAT_MULAW_8, SND_RATE_CODEC, 1, 0));
cthread_init();
tag_m = mutex_alloc();
stuffed_m = mutex_alloc();
stuffed_c = condition_alloc();
debug(("starting\n"));
SNDSetHost(NULL);
cthread_detach(cthread_fork(record));
cthread_join (cthread_fork(play));
cthread_exit(0);
}
-------8<-------snip-------8<-------snip-------8<-------snip-------8<-------
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads