# HG changeset patch # User Ralf Ertzinger # Date 1184272484 -7200 # Node ID 37598c8f442531bee2aeb94e10bf8ced8c2974c0 # Parent 0e0f73fed025385a837a8f4508f87ffa11330c88 - Add flac_is_our_fd() diff -r 0e0f73fed025 -r 37598c8f4425 src/flacng/plugin.c --- a/src/flacng/plugin.c Thu Jul 12 19:58:09 2007 +0200 +++ b/src/flacng/plugin.c Thu Jul 12 22:34:44 2007 +0200 @@ -57,7 +57,7 @@ flac_get_song_tuple, // get a tuple NULL, NULL, // write a tuple back to a file as a tag -/* flac_is_our_fd */ NULL, // version of is_our_file which is handed an FD + flac_is_our_fd, // version of is_our_file which is handed an FD flac_fmts // vector of fileextensions allowed by the plugin }; @@ -175,7 +175,7 @@ /* --- */ -gboolean flac_is_our_file(gchar* filename) { +gboolean flac_is_our_fd(gchar* filename, VFSFile* fd) { _ENTER; @@ -186,7 +186,7 @@ _DEBUG("Testing file: %s", filename); - if (FALSE == read_metadata(filename, test_decoder, test_info)) { + if (FALSE == read_metadata(fd, test_decoder, test_info)) { _DEBUG("File not handled by this plugin!"); _LEAVE FALSE; } @@ -203,10 +203,8 @@ * If we get here, the file is supported by FLAC. * The stream characteristics have been filled in by * the metadata callback. - * We can close the stream now. + * Do not close the stream, though. */ - - vfs_fclose(test_info->input_stream); test_info->input_stream = NULL; @@ -242,6 +240,31 @@ /* --- */ +gboolean flac_is_our_file(gchar* filename) { + + VFSFile* fd; + gboolean ret; + + _ENTER; + + _DEBUG("Testing file: %s", filename); + /* + * Open the file + */ + if (NULL == (fd = vfs_fopen(filename, "rb"))) { + _ERROR("Could not open file for reading! (%s)", filename); + _LEAVE FALSE; + } + + ret = flac_is_our_fd(filename, fd); + + vfs_fclose(fd); + + _LEAVE ret; +} + +/* --- */ + void squeeze_audio(gint32* src, void* dst, guint count, guint src_res, guint dst_res) { /* @@ -530,6 +553,7 @@ void flac_play_file (InputPlayback* input) { + VFSFile* fd; gint l; _ENTER; @@ -545,7 +569,15 @@ input->playing = FALSE; xmms_usleep(20000); - if (FALSE == read_metadata(input->filename, main_decoder, main_info)) { + /* + * Open the file + */ + if (NULL == (fd = vfs_fopen(filename, "rb"))) { + _ERROR("Could not open file for reading! (%s)", filename); + _LEAVE; + } + + if (FALSE == read_metadata(fd, main_decoder, main_info)) { _ERROR("Could not prepare file for playing!"); _LEAVE; } diff -r 0e0f73fed025 -r 37598c8f4425 src/flacng/tools.c --- a/src/flacng/tools.c Thu Jul 12 19:58:09 2007 +0200 +++ b/src/flacng/tools.c Thu Jul 12 22:34:44 2007 +0200 @@ -172,7 +172,7 @@ /* --- */ -gboolean read_metadata(gchar* filename, FLAC__StreamDecoder* decoder, callback_info* info) { +gboolean read_metadata(VFSFile* fd, FLAC__StreamDecoder* decoder, callback_info* info) { FLAC__StreamDecoderState ret; @@ -180,8 +180,6 @@ _DEBUG("Using callback_info %s", info->name); - _DEBUG("Opening file %s", filename); - /* * Reset the decoder */ @@ -192,6 +190,8 @@ reset_info(info); + info->input_stream = fd; + /* * Just scan the first 8k for the start of metadata */ @@ -205,20 +205,14 @@ info->testing = TRUE; /* - * Open the file - */ - if (NULL == (info->input_stream = vfs_fopen(filename, "rb"))) { - _ERROR("Could not open file for reading! (%s)", filename); - _LEAVE FALSE; - } - - /* * Try to decode the metadata */ if (false == FLAC__stream_decoder_process_until_end_of_metadata(decoder)) { ret = FLAC__stream_decoder_get_state(decoder); _DEBUG("Could not read the metadata: %s(%d)!", FLAC__StreamDecoderStateString[ret], ret); + /* Do not close the filehandle, it was passed to us */ + info->input_stream = NULL; reset_info(info); _LEAVE FALSE; } diff -r 0e0f73fed025 -r 37598c8f4425 src/flacng/tools.h --- a/src/flacng/tools.h Thu Jul 12 19:58:09 2007 +0200 +++ b/src/flacng/tools.h Thu Jul 12 22:34:44 2007 +0200 @@ -29,6 +29,6 @@ gchar* get_title(const gchar* filename, callback_info* info); TitleInput *get_tuple(const gchar *filename, callback_info* info); void add_comment(callback_info* info, gchar* key, gchar* value); -gboolean read_metadata(gchar* filename, FLAC__StreamDecoder* decoder, callback_info* info); +gboolean read_metadata(VFSFile* fd, FLAC__StreamDecoder* decoder, callback_info* info); #endif