diff options
author | Graydon, Tracy <tracy.graydon@intel.com> | 2012-11-28 19:03:52 -0800 |
---|---|---|
committer | Graydon, Tracy <tracy.graydon@intel.com> | 2012-11-28 19:03:52 -0800 |
commit | ff0a1baf66e5d4c4e93821a9732184e1cb5e7405 (patch) | |
tree | c1cb14f78b36f6368c0f86377cbb708d9b22611e /esdfile.c | |
download | esound-ff0a1baf66e5d4c4e93821a9732184e1cb5e7405.tar.gz esound-ff0a1baf66e5d4c4e93821a9732184e1cb5e7405.tar.bz2 esound-ff0a1baf66e5d4c4e93821a9732184e1cb5e7405.zip |
Initial commit for Tizensubmit/1.0/20121129.031008
Diffstat (limited to 'esdfile.c')
-rw-r--r-- | esdfile.c | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/esdfile.c b/esdfile.c new file mode 100644 index 0000000..74b221c --- /dev/null +++ b/esdfile.c @@ -0,0 +1,234 @@ +#include <esd.h> +#include <stdio.h> +#include <unistd.h> +#include <string.h> +#include <stdlib.h> + +/*******************************************************************/ +/* esdfile.c - audiofile wrappers for sane handling of files */ + +int esd_send_file( int esd, AFfilehandle au_file, int frame_length ) +{ + /* data for transfer */ + char buf[ ESD_BUF_SIZE ]; + int frames_read; + int buf_frames = ESD_BUF_SIZE / frame_length; + + while ( ( frames_read = afReadFrames( au_file, AF_DEFAULT_TRACK, + buf, buf_frames ) ) ) + { + if ( write ( esd, buf, frames_read * frame_length ) <= 0) + return 1; + } + + /* diagnostic info */ + /* + if ( getenv( "ESDBG" ) ) + printf( "esound sending file\n" ); + */ + + return 0; +} + +int esd_play_file( const char *name_prefix, const char *filename, int fallback ) +{ + /* input from libaudiofile... */ + AFfilehandle in_file; + int in_format, in_width, in_channels, frame_count; + int in_compression; + double in_rate; + int bytes_per_frame; + + /* output to esound... */ + int out_sock, out_bits, out_channels, out_rate; + int out_mode = ESD_STREAM, out_func = ESD_PLAY; + esd_format_t out_format; + char name[ ESD_NAME_MAX ] = ""; + + /* diagnostic info */ + /* + if ( getenv( "ESDBG" ) ) + printf( "esound playing file\n" ); + */ + + /* open the audio file */ + in_file = afOpenFile( filename, "rb", NULL ); + if ( !in_file ) + return 0; + + /* get audio file parameters */ + frame_count = afGetFrameCount( in_file, AF_DEFAULT_TRACK ); + in_channels = afGetChannels( in_file, AF_DEFAULT_TRACK ); + in_rate = afGetRate( in_file, AF_DEFAULT_TRACK ); + in_compression = afGetCompression ( in_file, AF_DEFAULT_TRACK ); + afGetSampleFormat( in_file, AF_DEFAULT_TRACK, &in_format, &in_width ); + + if(getenv("ESDBG")) + printf ("frames: %i channels: %i rate: %f format: %i width: %i\n", + frame_count, in_channels, in_rate, in_format, in_width); + + /* This check was added because audiofile doesn't tell us whether or + * not it will play compressed audio correctly. */ + if ( in_compression != AF_COMPRESSION_NONE && + in_compression != AF_COMPRESSION_G711_ULAW && + in_compression != AF_COMPRESSION_G711_ALAW && + in_compression != AF_COMPRESSION_IMA && + in_compression != AF_COMPRESSION_MS_ADPCM) + { + /* fputs ("compressed audio not supported supported\n", stderr); */ + return 0; + } + + /* convert audiofile parameters to EsounD parameters */ + if ( in_width == 8 ) + out_bits = ESD_BITS8; + else if ( in_width == 16 ) + out_bits = ESD_BITS16; + else + { + /* fputs ("only sample widths of 8 and 16 supported\n", stderr); */ + return 0; + } + + bytes_per_frame = ( in_width * in_channels ) / 8; + + if ( in_channels == 1 ) + out_channels = ESD_MONO; + else if ( in_channels == 2 ) + out_channels = ESD_STEREO; + else + { + /* fputs ("only 1 or 2 channel samples supported\n", stderr); */ + return 0; + } + + out_format = out_bits | out_channels | out_mode | out_func; + out_rate = (int) in_rate; + + /* construct name */ + if ( name_prefix ) { + strncpy( name, name_prefix, ESD_NAME_MAX - 2 ); + strcat( name, ":" ); + } + strncpy( name + strlen( name ), filename, ESD_NAME_MAX - strlen( name ) ); + + /* connect to server and play stream */ + if ( fallback ) + out_sock = esd_play_stream_fallback( out_format, out_rate, NULL, name ); + else + out_sock = esd_play_stream( out_format, out_rate, NULL, filename ); + + if ( out_sock <= 0 ) + return 0; + + /* play */ + esd_send_file( out_sock, in_file, bytes_per_frame ); + + /* close up and go home */ + close( out_sock ); + if ( afCloseFile ( in_file ) ) + return 0; + + /* diagnostic info */ + /* + if ( getenv( "ESDBG" ) ) + printf( "esound played file\n" ); + */ + + return 1; +} + +int esd_file_cache( int esd, const char *name_prefix, const char *filename ) +{ + /* input from libaudiofile... */ + AFfilehandle in_file; + int in_format, in_width, in_channels, frame_count; + double in_rate; + int bytes_per_frame; + + /* output to esound... */ + int out_bits, out_channels, out_rate; + int out_mode = ESD_STREAM, out_func = ESD_PLAY; + esd_format_t out_format; + int length, sample_id, confirm_id; + char name[ ESD_NAME_MAX ]; + + /* diagnostic info */ + /* + if ( getenv( "ESDBG" ) ) + printf( "esound caching file\n" ); + */ + + /* open the audio file */ + in_file = afOpenFile( filename, "rb", NULL ); + if ( !in_file ) + return -1; + + /* get audio file parameters */ + frame_count = afGetFrameCount( in_file, AF_DEFAULT_TRACK ); + in_channels = afGetChannels( in_file, AF_DEFAULT_TRACK ); + in_rate = afGetRate( in_file, AF_DEFAULT_TRACK ); + length = afGetTrackBytes( in_file, AF_DEFAULT_TRACK ); + afGetSampleFormat( in_file, AF_DEFAULT_TRACK, &in_format, &in_width ); + + /* printf ("frames: %i channels: %i rate: %f format: %i width: %i\n", + * frame_count, in_channels, in_rate, in_format, in_width); + */ + + /* convert audiofile parameters to EsounD parameters */ + if ( in_width == 8 ) + out_bits = ESD_BITS8; + else if ( in_width == 16 ) + out_bits = ESD_BITS16; + else + { + /* fputs ("only sample widths of 8 and 16 supported\n", stderr); */ + return -1; + } + + bytes_per_frame = ( in_width * in_channels ) / 8; + + if ( in_channels == 1 ) + out_channels = ESD_MONO; + else if ( in_channels == 2 ) + out_channels = ESD_STEREO; + else + { + /* fputs ("only 1 or 2 channel samples supported\n", stderr); */ + return -1; + } + + out_format = out_bits | out_channels | out_mode | out_func; + out_rate = (int) in_rate; + + /* construct name */ + if ( name_prefix ) { + strncpy( name, name_prefix, ESD_NAME_MAX - 2 ); + strcat( name, ":" ); + } + strncpy( name + strlen( name ), filename, ESD_NAME_MAX - strlen( name ) ); + + /* connect to server and play stream */ + sample_id = esd_sample_cache( esd, out_format, out_rate, + length, name ); + + /* play */ + esd_send_file( esd, in_file, bytes_per_frame ); + + /* close up and go home */ + if ( afCloseFile ( in_file ) ) + return -1; + + confirm_id = esd_confirm_sample_cache( esd ); + if ( confirm_id != sample_id ) + return -1; + + /* diagnostic info */ + /* + if ( getenv( "ESDBG" ) ) + printf( "esound cached file\n" ); + */ + + return sample_id; +} + |