1998-09-15 09:28:50 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include "../include/asoundlib.h"
|
|
|
|
|
|
1998-09-21 21:07:47 +00:00
|
|
|
#define BUFFER_SIZE 800000
|
|
|
|
|
|
1998-09-15 09:28:50 +00:00
|
|
|
static char *xitoa( int aaa )
|
|
|
|
|
{
|
|
|
|
|
static char str[12];
|
|
|
|
|
|
|
|
|
|
sprintf( str, "%i", aaa );
|
|
|
|
|
return str;
|
|
|
|
|
}
|
|
|
|
|
|
1998-09-21 21:07:47 +00:00
|
|
|
void setformat( void *phandle, void *rhandle )
|
|
|
|
|
{
|
|
|
|
|
int err;
|
|
|
|
|
snd_pcm_format_t format;
|
|
|
|
|
|
|
|
|
|
format.format = SND_PCM_SFMT_S16_LE;
|
|
|
|
|
format.channels = 2;
|
|
|
|
|
format.rate = 22050;
|
|
|
|
|
if ( (err = snd_pcm_playback_format( phandle, &format )) < 0 ) {
|
|
|
|
|
printf( "Playback format error: %s\n", snd_strerror( err ) );
|
|
|
|
|
}
|
|
|
|
|
if ( (err = snd_pcm_record_format( rhandle, &format )) < 0 ) {
|
|
|
|
|
printf( "Record format error: %s\n", snd_strerror( err ) );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
1998-09-15 09:28:50 +00:00
|
|
|
void method1( void )
|
|
|
|
|
{
|
|
|
|
|
void *phandle, *rhandle;
|
1998-09-21 21:07:47 +00:00
|
|
|
char buffer[BUFFER_SIZE];
|
1998-09-15 09:28:50 +00:00
|
|
|
int err;
|
|
|
|
|
|
|
|
|
|
if ( (err = snd_pcm_open( &phandle, 0, 0, SND_PCM_OPEN_PLAYBACK )) < 0 ) {
|
|
|
|
|
printf( "Playback open error: %s\n", snd_strerror( err ) );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if ( (err = snd_pcm_open( &rhandle, 0, 0, SND_PCM_OPEN_RECORD )) < 0 ) {
|
|
|
|
|
printf( "Record open error: %s\n", snd_strerror( err ) );
|
|
|
|
|
return;
|
|
|
|
|
}
|
1998-09-21 21:07:47 +00:00
|
|
|
setformat( phandle, rhandle );
|
1998-09-15 09:28:50 +00:00
|
|
|
printf( "Recording... " ); fflush( stdout );
|
|
|
|
|
if ( (err = snd_pcm_read( rhandle, buffer, sizeof( buffer ) )) != sizeof( buffer ) ) {
|
|
|
|
|
printf( "Read error: %s\n", err < 0 ? snd_strerror( err ) : xitoa( err ) );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
printf( "done...\n" );
|
|
|
|
|
printf( "Playback... " ); fflush( stdout );
|
|
|
|
|
if ( (err = snd_pcm_write( phandle, buffer, sizeof( buffer ) )) != sizeof( buffer ) ) {
|
|
|
|
|
printf( "Write error: %s\n", err < 0 ? snd_strerror( err ) : xitoa( err ) );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
printf( "done...\n" );
|
|
|
|
|
snd_pcm_close( phandle );
|
|
|
|
|
printf( "Playback close...\n" );
|
|
|
|
|
snd_pcm_close( rhandle );
|
|
|
|
|
printf( "Record close...\n" );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void method2( void )
|
|
|
|
|
{
|
|
|
|
|
void *phandle, *rhandle;
|
1998-09-21 21:07:47 +00:00
|
|
|
char buffer[BUFFER_SIZE];
|
1998-09-15 09:28:50 +00:00
|
|
|
int err;
|
|
|
|
|
|
|
|
|
|
if ( (err = snd_pcm_open( &phandle, 0, 0, SND_PCM_OPEN_PLAYBACK )) < 0 ) {
|
|
|
|
|
printf( "Playback open error: %s\n", snd_strerror( err ) );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if ( (err = snd_pcm_open( &rhandle, 0, 0, SND_PCM_OPEN_RECORD )) < 0 ) {
|
|
|
|
|
printf( "Record open error: %s\n", snd_strerror( err ) );
|
|
|
|
|
return;
|
|
|
|
|
}
|
1998-09-21 21:07:47 +00:00
|
|
|
setformat( phandle, rhandle );
|
1998-09-15 09:28:50 +00:00
|
|
|
printf( "Recording... " ); fflush( stdout );
|
|
|
|
|
if ( (err = snd_pcm_read( rhandle, buffer, sizeof( buffer ) )) != sizeof( buffer ) ) {
|
|
|
|
|
printf( "Read error: %s\n", err < 0 ? snd_strerror( err ) : xitoa( err ) );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
printf( "done...\n" );
|
|
|
|
|
if ( (err = snd_pcm_flush_record( rhandle )) < 0 ) {
|
|
|
|
|
printf( "Record flush error: %s\n", snd_strerror( err ) );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
printf( "Record flush done...\n" );
|
|
|
|
|
printf( "Playback... " ); fflush( stdout );
|
|
|
|
|
if ( (err = snd_pcm_write( phandle, buffer, sizeof( buffer ) )) != sizeof( buffer ) ) {
|
|
|
|
|
printf( "Write error: %s\n", err < 0 ? snd_strerror( err ) : xitoa( err ) );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
printf( "done...\n" );
|
|
|
|
|
if ( (err = snd_pcm_flush_playback( phandle )) < 0 ) {
|
|
|
|
|
printf( "Playback flush error: %s\n", snd_strerror( err ) );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
printf( "Playback flush done...\n" );
|
|
|
|
|
snd_pcm_close( phandle );
|
|
|
|
|
printf( "Playback close...\n" );
|
|
|
|
|
snd_pcm_close( rhandle );
|
|
|
|
|
printf( "Record close...\n" );
|
|
|
|
|
}
|
|
|
|
|
|
1998-09-21 21:07:47 +00:00
|
|
|
void method3( void )
|
|
|
|
|
{
|
|
|
|
|
void *handle;
|
|
|
|
|
char buffer[BUFFER_SIZE];
|
|
|
|
|
int err;
|
|
|
|
|
|
|
|
|
|
if ( (err = snd_pcm_open( &handle, 0, 0, SND_PCM_OPEN_DUPLEX )) < 0 ) {
|
|
|
|
|
printf( "Duplex open error: %s\n", snd_strerror( err ) );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
setformat( handle, handle );
|
|
|
|
|
printf( "Recording... " ); fflush( stdout );
|
|
|
|
|
if ( (err = snd_pcm_read( handle, buffer, sizeof( buffer ) )) != sizeof( buffer ) ) {
|
|
|
|
|
printf( "Read error: %s\n", err < 0 ? snd_strerror( err ) : xitoa( err ) );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
printf( "done...\n" );
|
|
|
|
|
if ( (err = snd_pcm_flush_record( handle )) < 0 ) {
|
|
|
|
|
printf( "Record flush error: %s\n", snd_strerror( err ) );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
printf( "Record flush done...\n" );
|
|
|
|
|
printf( "Playback... " ); fflush( stdout );
|
|
|
|
|
if ( (err = snd_pcm_write( handle, buffer, sizeof( buffer ) )) != sizeof( buffer ) ) {
|
|
|
|
|
printf( "Write error: %s\n", err < 0 ? snd_strerror( err ) : xitoa( err ) );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
printf( "done...\n" );
|
|
|
|
|
if ( (err = snd_pcm_flush_playback( handle )) < 0 ) {
|
|
|
|
|
printf( "Playback flush error: %s\n", snd_strerror( err ) );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
printf( "Playback flush done...\n" );
|
|
|
|
|
snd_pcm_close( handle );
|
|
|
|
|
printf( "Close...\n" );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
1998-09-15 09:28:50 +00:00
|
|
|
void main( void )
|
|
|
|
|
{
|
|
|
|
|
printf( ">>>>> METHOD 1\n" );
|
|
|
|
|
method1();
|
|
|
|
|
printf( ">>>>> METHOD 2\n" );
|
|
|
|
|
method2();
|
1998-09-21 21:07:47 +00:00
|
|
|
printf( ">>>>> METHOD 3\n" );
|
|
|
|
|
method3();
|
1998-09-15 09:28:50 +00:00
|
|
|
}
|