X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faudio_output%2Ffile.c;h=fb568059e996e26a0e55d46737cc33d5f7d26ea2;hb=a63b0ed15e9fb8894f63c4261811ab2ed2a890c3;hp=07da0fe1384492ef5aeeea22a6e2eff31fb3b626;hpb=f66626b34809a4881a52582ae755586e885270c6;p=vlc diff --git a/modules/audio_output/file.c b/modules/audio_output/file.c index 07da0fe138..fb568059e9 100644 --- a/modules/audio_output/file.c +++ b/modules/audio_output/file.c @@ -30,15 +30,12 @@ # include "config.h" #endif -#include - #include #include #include #include /* WAVEHEADER */ -#include +#include -#define FRAME_SIZE 2048 #define A52_FRAME_NB 1536 /***************************************************************************** @@ -56,7 +53,7 @@ struct aout_sys_t }; #define CHANNELS_MAX 6 -static int pi_channels_maps[CHANNELS_MAX+1] = +static const int pi_channels_maps[CHANNELS_MAX+1] = { 0, AOUT_CHAN_CENTER, @@ -75,17 +72,15 @@ static int pi_channels_maps[CHANNELS_MAX+1] = *****************************************************************************/ static int Open ( vlc_object_t * ); static void Close ( vlc_object_t * ); -static void Play ( aout_instance_t * ); +static void Play ( audio_output_t *, block_t * ); /***************************************************************************** * Module descriptor *****************************************************************************/ #define FORMAT_TEXT N_("Output format") -#define FORMAT_LONGTEXT N_("One of \"u8\", \"s8\", \"u16\", \"s16\", " \ - "\"u16_le\", \"s16_le\", \"u16_be\", \"s16_be\", \"fixed32\", " \ - "\"float32\" or \"spdif\"") + #define CHANNELS_TEXT N_("Number of output channels") -#define CHANNELS_LONGTEXT N_("By default, all the channels of the incoming " \ +#define CHANNELS_LONGTEXT N_("By default (0), all the channels of the incoming " \ "will be saved but you can restrict the number of channels here.") #define WAV_TEXT N_("Add WAVE header") @@ -95,56 +90,52 @@ static void Play ( aout_instance_t * ); static const char *const format_list[] = { "u8", "s8", "u16", "s16", "u16_le", "s16_le", "u16_be", "s16_be", "fixed32", "float32", "spdif" }; -static const int format_int[] = { VLC_FOURCC('u','8',' ',' '), - VLC_FOURCC('s','8',' ',' '), - AOUT_FMT_U16_NE, AOUT_FMT_S16_NE, - VLC_FOURCC('u','1','6','l'), - VLC_FOURCC('s','1','6','l'), - VLC_FOURCC('u','1','6','b'), - VLC_FOURCC('s','1','6','b'), - VLC_FOURCC('f','i','3','2'), - VLC_FOURCC('f','l','3','2'), - VLC_FOURCC('s','p','i','f') }; +static const int format_int[] = { VLC_CODEC_U8, + VLC_CODEC_S8, + VLC_CODEC_U16N, VLC_CODEC_S16N, + VLC_CODEC_U16L, + VLC_CODEC_S16L, + VLC_CODEC_U16B, + VLC_CODEC_S16B, + VLC_CODEC_FI32, + VLC_CODEC_FL32, + VLC_CODEC_SPDIFL }; #define FILE_TEXT N_("Output file") #define FILE_LONGTEXT N_("File to which the audio samples will be written to. (\"-\" for stdout") -vlc_module_begin(); - set_description( N_("File audio output") ); - set_shortname( N_("File") ); - set_category( CAT_AUDIO ); - set_subcategory( SUBCAT_AUDIO_AOUT ); - - add_string( "audiofile-format", "s16", NULL, - FORMAT_TEXT, FORMAT_LONGTEXT, true ); - change_string_list( format_list, 0, 0 ); - add_integer( "audiofile-channels", 0, NULL, - CHANNELS_TEXT, CHANNELS_LONGTEXT, true ); - add_file( "audiofile-file", "audiofile.wav", NULL, FILE_TEXT, - FILE_LONGTEXT, false ); - change_unsafe(); - add_bool( "audiofile-wav", 1, NULL, WAV_TEXT, WAV_LONGTEXT, true ); - - set_capability( "audio output", 0 ); - add_shortcut( "file" ); - add_shortcut( "audiofile" ); - set_callbacks( Open, Close ); -vlc_module_end(); +vlc_module_begin () + set_description( N_("File audio output") ) + set_shortname( N_("File") ) + set_category( CAT_AUDIO ) + set_subcategory( SUBCAT_AUDIO_AOUT ) + + add_savefile( "audiofile-file", "audiofile.wav", FILE_TEXT, + FILE_LONGTEXT, false ) + add_string( "audiofile-format", "s16", + FORMAT_TEXT, FORMAT_TEXT, true ) + change_string_list( format_list, 0, 0 ) + add_integer( "audiofile-channels", 0, + CHANNELS_TEXT, CHANNELS_LONGTEXT, true ) + change_integer_range( 0, 6 ) + add_bool( "audiofile-wav", true, WAV_TEXT, WAV_LONGTEXT, true ) + + set_capability( "audio output", 0 ) + add_shortcut( "file", "audiofile" ) + set_callbacks( Open, Close ) +vlc_module_end () /***************************************************************************** * Open: open a dummy audio device *****************************************************************************/ static int Open( vlc_object_t * p_this ) { - aout_instance_t * p_aout = (aout_instance_t *)p_this; + audio_output_t * p_aout = (audio_output_t *)p_this; char * psz_name, * psz_format; - const char ** ppsz_compare = format_list; - vlc_value_t val; + const char * const * ppsz_compare = format_list; int i_channels, i = 0; - var_Create( p_this, "audiofile-file", VLC_VAR_STRING|VLC_VAR_DOINHERIT ); - var_Get( p_this, "audiofile-file", &val ); - psz_name = val.psz_string; + psz_name = var_CreateGetString( p_this, "audiofile-file" ); if( !psz_name || !*psz_name ) { msg_Err( p_aout, "you need to specify an output file name" ); @@ -153,28 +144,28 @@ static int Open( vlc_object_t * p_this ) } /* Allocate structure */ - p_aout->output.p_sys = malloc( sizeof( aout_sys_t ) ); - if( p_aout->output.p_sys == NULL ) + p_aout->sys = malloc( sizeof( aout_sys_t ) ); + if( p_aout->sys == NULL ) return VLC_ENOMEM; if( !strcmp( psz_name, "-" ) ) - p_aout->output.p_sys->p_file = stdout; + p_aout->sys->p_file = stdout; else - p_aout->output.p_sys->p_file = utf8_fopen( psz_name, "wb" ); + p_aout->sys->p_file = vlc_fopen( psz_name, "wb" ); free( psz_name ); - if ( p_aout->output.p_sys->p_file == NULL ) + if ( p_aout->sys->p_file == NULL ) { - free( p_aout->output.p_sys ); + free( p_aout->sys ); return VLC_EGENERIC; } - p_aout->output.pf_play = Play; + p_aout->pf_play = Play; + p_aout->pf_pause = NULL; + p_aout->pf_flush = NULL; /* Audio format */ - var_Create( p_this, "audiofile-format", VLC_VAR_STRING|VLC_VAR_DOINHERIT ); - var_Get( p_this, "audiofile-format", &val ); - psz_format = val.psz_string; + psz_format = var_CreateGetString( p_this, "audiofile-format" ); while ( *ppsz_compare != NULL ) { @@ -189,61 +180,55 @@ static int Open( vlc_object_t * p_this ) { msg_Err( p_aout, "cannot understand the format string (%s)", psz_format ); - if( p_aout->output.p_sys->p_file != stdout ) - fclose( p_aout->output.p_sys->p_file ); - free( p_aout->output.p_sys ); + if( p_aout->sys->p_file != stdout ) + fclose( p_aout->sys->p_file ); + free( p_aout->sys ); + free( psz_format ); return VLC_EGENERIC; } + free( psz_format ); - p_aout->output.output.i_format = format_int[i]; - if ( AOUT_FMT_NON_LINEAR( &p_aout->output.output ) ) + p_aout->format.i_format = format_int[i]; + if ( AOUT_FMT_SPDIF( &p_aout->format ) ) { - p_aout->output.i_nb_samples = A52_FRAME_NB; - p_aout->output.output.i_bytes_per_frame = AOUT_SPDIF_SIZE; - p_aout->output.output.i_frame_length = A52_FRAME_NB; + p_aout->format.i_bytes_per_frame = AOUT_SPDIF_SIZE; + p_aout->format.i_frame_length = A52_FRAME_NB; aout_VolumeNoneInit( p_aout ); } else - { - p_aout->output.i_nb_samples = FRAME_SIZE; aout_VolumeSoftInit( p_aout ); - } /* Channels number */ - var_Create( p_this, "audiofile-channels", - VLC_VAR_INTEGER|VLC_VAR_DOINHERIT ); - var_Get( p_this, "audiofile-channels", &val ); - i_channels = val.i_int; + i_channels = var_CreateGetInteger( p_this, "audiofile-channels" ); if( i_channels > 0 && i_channels <= CHANNELS_MAX ) { - p_aout->output.output.i_physical_channels = + p_aout->format.i_physical_channels = pi_channels_maps[i_channels]; } /* WAV header */ - var_Create( p_this, "audiofile-wav", VLC_VAR_BOOL|VLC_VAR_DOINHERIT ); - var_Get( p_this, "audiofile-wav", &val ); - p_aout->output.p_sys->b_add_wav_header = val.b_bool; + p_aout->sys->b_add_wav_header = var_CreateGetBool( p_this, + "audiofile-wav" ); - if( p_aout->output.p_sys->b_add_wav_header ) + if( p_aout->sys->b_add_wav_header ) { /* Write wave header */ - WAVEHEADER *wh = &p_aout->output.p_sys->waveh; + WAVEHEADER *wh = &p_aout->sys->waveh; - memset( wh, 0, sizeof(wh) ); + memset( wh, 0, sizeof(*wh) ); - switch( p_aout->output.output.i_format ) + switch( p_aout->format.i_format ) { - case VLC_FOURCC('f','l','3','2'): + case VLC_CODEC_FL32: wh->Format = WAVE_FORMAT_IEEE_FLOAT; wh->BitsPerSample = sizeof(float) * 8; break; - case VLC_FOURCC('u','8',' ',' '): + case VLC_CODEC_U8: wh->Format = WAVE_FORMAT_PCM; wh->BitsPerSample = 8; break; - case VLC_FOURCC('s','1','6','l'): + case VLC_CODEC_S16L: default: wh->Format = WAVE_FORMAT_PCM; wh->BitsPerSample = 16; @@ -256,8 +241,8 @@ static int Open( vlc_object_t * p_this ) wh->SubChunkID = VLC_FOURCC('f', 'm', 't', ' '); wh->SubChunkLength = 16; - wh->Modus = aout_FormatNbChannels( &p_aout->output.output ); - wh->SampleFreq = p_aout->output.output.i_rate; + wh->Modus = aout_FormatNbChannels( &p_aout->format ); + wh->SampleFreq = p_aout->format.i_rate; wh->BytesPerSample = wh->Modus * ( wh->BitsPerSample / 8 ); wh->BytesPerSec = wh->BytesPerSample * wh->SampleFreq; @@ -274,7 +259,7 @@ static int Open( vlc_object_t * p_this ) SetDWLE( &wh->BytesPerSec, wh->BytesPerSec ); if( fwrite( wh, sizeof(WAVEHEADER), 1, - p_aout->output.p_sys->p_file ) != 1 ) + p_aout->sys->p_file ) != 1 ) { msg_Err( p_aout, "write error (%m)" ); } @@ -288,59 +273,55 @@ static int Open( vlc_object_t * p_this ) *****************************************************************************/ static void Close( vlc_object_t * p_this ) { - aout_instance_t * p_aout = (aout_instance_t *)p_this; + audio_output_t * p_aout = (audio_output_t *)p_this; msg_Dbg( p_aout, "closing audio file" ); - if( p_aout->output.p_sys->b_add_wav_header ) + if( p_aout->sys->b_add_wav_header ) { /* Update Wave Header */ - p_aout->output.p_sys->waveh.Length = - p_aout->output.p_sys->waveh.DataLength + sizeof(WAVEHEADER) - 4; + p_aout->sys->waveh.Length = + p_aout->sys->waveh.DataLength + sizeof(WAVEHEADER) - 4; /* Write Wave Header */ - if( fseek( p_aout->output.p_sys->p_file, 0, SEEK_SET ) ) + if( fseek( p_aout->sys->p_file, 0, SEEK_SET ) ) { msg_Err( p_aout, "seek error (%m)" ); } /* Header -> little endian format */ - SetDWLE( &p_aout->output.p_sys->waveh.Length, - p_aout->output.p_sys->waveh.Length ); - SetDWLE( &p_aout->output.p_sys->waveh.DataLength, - p_aout->output.p_sys->waveh.DataLength ); + SetDWLE( &p_aout->sys->waveh.Length, + p_aout->sys->waveh.Length ); + SetDWLE( &p_aout->sys->waveh.DataLength, + p_aout->sys->waveh.DataLength ); - if( fwrite( &p_aout->output.p_sys->waveh, sizeof(WAVEHEADER), 1, - p_aout->output.p_sys->p_file ) != 1 ) + if( fwrite( &p_aout->sys->waveh, sizeof(WAVEHEADER), 1, + p_aout->sys->p_file ) != 1 ) { msg_Err( p_aout, "write error (%m)" ); } } - if( p_aout->output.p_sys->p_file != stdout ) - fclose( p_aout->output.p_sys->p_file ); - free( p_aout->output.p_sys ); + if( p_aout->sys->p_file != stdout ) + fclose( p_aout->sys->p_file ); + free( p_aout->sys ); } /***************************************************************************** * Play: pretend to play a sound *****************************************************************************/ -static void Play( aout_instance_t * p_aout ) +static void Play( audio_output_t * p_aout, block_t *p_buffer ) { - aout_buffer_t * p_buffer; - - p_buffer = aout_FifoPop( p_aout, &p_aout->output.fifo ); - - if( fwrite( p_buffer->p_buffer, p_buffer->i_nb_bytes, 1, - p_aout->output.p_sys->p_file ) != 1 ) + if( fwrite( p_buffer->p_buffer, p_buffer->i_buffer, 1, + p_aout->sys->p_file ) != 1 ) { msg_Err( p_aout, "write error (%m)" ); } - if( p_aout->output.p_sys->b_add_wav_header ) + if( p_aout->sys->b_add_wav_header ) { /* Update Wave Header */ - p_aout->output.p_sys->waveh.DataLength += p_buffer->i_nb_bytes; + p_aout->sys->waveh.DataLength += p_buffer->i_buffer; } aout_BufferFree( p_buffer );