annotate src/flac112/plugin.c @ 492:0dd1ff7e5ba7 trunk

[svn] flac 112 plugin: stability fixes and a new option to disable bitrate update in player window during playback (saves cpu, this is the solution for most people playing flac and reporting high cpu usage)
author giacomo
date Sun, 21 Jan 2007 16:03:30 -0800
parents be4cde738a73
children 5f2145032f46
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
1 /* libxmms-flac - XMMS FLAC input plugin
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
2 * Copyright (C) 2000,2001,2002,2003,2004,2005 Josh Coalson
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
3 *
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
4 * This program is free software; you can redistribute it and/or
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
5 * modify it under the terms of the GNU General Public License
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
6 * as published by the Free Software Foundation; either version 2
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
7 * of the License, or (at your option) any later version.
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
8 *
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
9 * This program is distributed in the hope that it will be useful,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
12 * GNU General Public License for more details.
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
13 *
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
14 * You should have received a copy of the GNU General Public License
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
15 * along with this program; if not, write to the Free Software
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
17 */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
18
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
19 #include <stdlib.h>
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
20 #include <string.h>
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
21 #include <stdio.h>
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
22 #include <glib.h>
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
23 #include <pwd.h>
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
24 #include <sys/types.h>
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
25 #include <unistd.h>
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
26
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
27 #include <audacious/plugin.h>
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
28 #include <audacious/output.h>
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
29 #include <audacious/util.h>
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
30 #include <audacious/configdb.h>
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
31 #include <audacious/titlestring.h>
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
32 #include <audacious/vfs.h>
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
33
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
34 #ifdef HAVE_CONFIG_H
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
35 #include <config.h>
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
36 #endif
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
37
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
38 #ifdef HAVE_LANGINFO_CODESET
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
39 #include <langinfo.h>
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
40 #endif
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
41
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
42 #include "FLAC/all.h"
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
43 #include "plugin_common/all.h"
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
44 #include "grabbag.h"
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
45 #include "replaygain_synthesis.h"
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
46 #include "configure.h"
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
47 #include "charset.h"
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
48 #include "http.h"
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
49 #include "tag.h"
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
50
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
51 #ifdef min
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
52 #undef min
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
53 #endif
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
54 #define min(x,y) ((x)<(y)?(x):(y))
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
55
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
56 /* adjust for compilers that can't understand using LLU suffix for uint64_t literals */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
57 #ifdef _MSC_VER
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
58 #define FLAC__U64L(x) x
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
59 #else
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
60 #define FLAC__U64L(x) x##LLU
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
61 #endif
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
62
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
63 extern void FLAC_XMMS__file_info_box(char *filename);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
64
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
65 typedef struct {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
66 FLAC__bool abort_flag;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
67 FLAC__bool is_playing;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
68 FLAC__bool eof;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
69 FLAC__bool play_thread_open; /* if true, is_playing must also be true */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
70 unsigned total_samples;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
71 unsigned bits_per_sample;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
72 unsigned channels;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
73 unsigned sample_rate;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
74 unsigned length_in_msec;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
75 gchar *title;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
76 AFormat sample_format;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
77 unsigned sample_format_bytes_per_sample;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
78 int seek_to_in_sec;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
79 FLAC__bool has_replaygain;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
80 double replay_scale;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
81 DitherContext dither_context;
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
82 VFSFile *vfsfile;
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
83 } file_info_struct;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
84
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
85 typedef FLAC__StreamDecoderWriteStatus (*WriteCallback) (const void *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
86 typedef void (*MetadataCallback) (const void *decoder, const FLAC__StreamMetadata *metadata, void *client_data);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
87 typedef void (*ErrorCallback) (const void *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
88
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
89 typedef struct {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
90 FLAC__bool seekable;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
91 void* (*new_decoder) (void);
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
92 FLAC__bool (*set_source) (void *decoder, const char* source);
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
93 FLAC__bool (*unset_source) (void *decoder);
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
94 FLAC__bool (*set_md5_checking) (void *decoder, FLAC__bool value);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
95 FLAC__bool (*set_metadata_ignore_all) (void *decoder);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
96 FLAC__bool (*set_metadata_respond) (void *decoder, FLAC__MetadataType type);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
97 FLAC__bool (*set_write_callback) (void *decoder, WriteCallback value);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
98 FLAC__bool (*set_metadata_callback) (void *decoder, MetadataCallback value);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
99 FLAC__bool (*set_error_callback) (void *decoder, ErrorCallback value);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
100 FLAC__bool (*set_client_data) (void *decoder, void *value);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
101 FLAC__bool (*decoder_init) (void *decoder);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
102 void (*safe_decoder_finish) (void *decoder);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
103 void (*safe_decoder_delete) (void *decoder);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
104 FLAC__bool (*process_until_end_of_metadata) (void *decoder);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
105 FLAC__bool (*process_single) (void *decoder);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
106 FLAC__bool (*is_eof) (void *decoder);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
107 } decoder_funcs_t;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
108
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
109 #define NUM_DECODER_TYPES 2
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
110 typedef enum {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
111 DECODER_FILE,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
112 DECODER_HTTP
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
113 } decoder_t;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
114
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
115 static void FLAC_XMMS__init();
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
116 static int FLAC_XMMS__is_our_file(char *filename);
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
117 static int FLAC_XMMS__is_our_file_from_vfs(char *filename, VFSFile *vfsfile);
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
118 static void FLAC_XMMS__play_file(char *filename);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
119 static void FLAC_XMMS__stop();
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
120 static void FLAC_XMMS__pause(short p);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
121 static void FLAC_XMMS__seek(int time);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
122 static int FLAC_XMMS__get_time();
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
123 static void FLAC_XMMS__cleanup();
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
124 static void FLAC_XMMS__get_song_info(char *filename, char **title, int *length);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
125
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
126 static void *play_loop_(void *arg);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
127
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
128 static FLAC__bool safe_decoder_init_(const char *filename, void **decoderp, decoder_funcs_t const ** fnsp);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
129 static void file_decoder_safe_decoder_finish_(void *decoder);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
130 static void file_decoder_safe_decoder_delete_(void *decoder);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
131 static FLAC__StreamDecoderWriteStatus write_callback_(const void *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
132 static void metadata_callback_(const void *decoder, const FLAC__StreamMetadata *metadata, void *client_data);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
133 static void error_callback_(const void *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
134
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
135 static void init_decoder_func_tables();
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
136 static decoder_t source_to_decoder_type (const char *source);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
137
372
a157306caf03 [svn] - finalize the plugin-side of the extension-assist ABI
nenolod
parents: 368
diff changeset
138 gchar *flac_fmts[] = { "flac", NULL };
a157306caf03 [svn] - finalize the plugin-side of the extension-assist ABI
nenolod
parents: 368
diff changeset
139
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
140 InputPlugin flac_ip =
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
141 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
142 NULL,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
143 NULL,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
144 NULL,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
145 FLAC_XMMS__init,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
146 FLAC_XMMS__aboutbox,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
147 FLAC_XMMS__configure,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
148 FLAC_XMMS__is_our_file,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
149 NULL,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
150 FLAC_XMMS__play_file,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
151 FLAC_XMMS__stop,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
152 FLAC_XMMS__pause,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
153 FLAC_XMMS__seek,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
154 NULL,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
155 FLAC_XMMS__get_time,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
156 NULL,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
157 NULL,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
158 FLAC_XMMS__cleanup,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
159 NULL,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
160 NULL,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
161 NULL,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
162 NULL,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
163 FLAC_XMMS__get_song_info,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
164 FLAC_XMMS__file_info_box,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
165 NULL,
372
a157306caf03 [svn] - finalize the plugin-side of the extension-assist ABI
nenolod
parents: 368
diff changeset
166 flac_get_tuple,
a157306caf03 [svn] - finalize the plugin-side of the extension-assist ABI
nenolod
parents: 368
diff changeset
167 NULL, // set tuple
368
c812e846b84e [svn] - add support for extension probing to many plugins.
nenolod
parents: 207
diff changeset
168 NULL,
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
169 FLAC_XMMS__is_our_file_from_vfs,
372
a157306caf03 [svn] - finalize the plugin-side of the extension-assist ABI
nenolod
parents: 368
diff changeset
170 flac_fmts,
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
171 };
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
172
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
173 #define SAMPLES_PER_WRITE 512
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
174 #define SAMPLE_BUFFER_SIZE ((FLAC__MAX_BLOCK_SIZE + SAMPLES_PER_WRITE) * FLAC_PLUGIN__MAX_SUPPORTED_CHANNELS * (24/8))
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
175 static FLAC__byte sample_buffer_[SAMPLE_BUFFER_SIZE];
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
176 static unsigned sample_buffer_first_, sample_buffer_last_;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
177
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
178 static void *decoder_ = 0, *decoder2 = 0;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
179 static file_info_struct file_info_;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
180 static GThread *decode_thread_;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
181 static FLAC__bool audio_error_ = false;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
182 static FLAC__bool is_big_endian_host_;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
183
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
184 #define BITRATE_HIST_SEGMENT_MSEC 500
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
185 /* 500ms * 50 = 25s should be enough */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
186 #define BITRATE_HIST_SIZE 50
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
187 static unsigned bitrate_history_[BITRATE_HIST_SIZE];
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
188
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
189 /* A table of sets of decoder functions, indexed by decoder_t */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
190 static const decoder_funcs_t* DECODER_FUNCS[NUM_DECODER_TYPES];
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
191
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
192 static decoder_funcs_t const * decoder_func_table_, * decoder_func_table2;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
193
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
194
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
195 InputPlugin *get_iplugin_info()
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
196 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
197 flac_ip.description = g_strdup_printf(_("FLAC Audio Plugin"));
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
198 return &flac_ip;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
199 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
200
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
201 void set_track_info(const char* title, int length_in_msec)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
202 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
203 if (file_info_.is_playing) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
204 flac_ip.set_info((char*) title, length_in_msec, file_info_.sample_rate * file_info_.channels * file_info_.bits_per_sample, file_info_.sample_rate, file_info_.channels);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
205 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
206 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
207
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
208 static gchar* homedir()
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
209 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
210 gchar *result;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
211 char *env_home = getenv("HOME");
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
212 if (env_home) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
213 result = g_strdup (env_home);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
214 } else {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
215 uid_t uid = getuid();
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
216 struct passwd *pwent;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
217 do {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
218 pwent = getpwent();
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
219 } while (pwent && pwent->pw_uid != uid);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
220 result = pwent ? g_strdup (pwent->pw_dir) : NULL;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
221 endpwent();
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
222 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
223 return result;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
224 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
225
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
226 void FLAC_XMMS__init()
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
227 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
228 ConfigDb *db;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
229 FLAC__uint32 test = 1;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
230 gchar *tmp = NULL;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
231
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
232 is_big_endian_host_ = (*((FLAC__byte*)(&test)))? false : true;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
233
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
234 memset(&flac_cfg, 0, sizeof(flac_cfg));
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
235
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
236 db = bmp_cfg_db_open();
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
237
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
238 /* title */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
239
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
240 bmp_cfg_db_get_bool(db, "flac", "title.tag_override", &flac_cfg.title.tag_override);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
241
492
0dd1ff7e5ba7 [svn] flac 112 plugin: stability fixes and a new option to disable bitrate update in player window during playback (saves cpu, this is the solution for most people playing flac and reporting high cpu usage)
giacomo
parents: 490
diff changeset
242 bmp_cfg_db_get_bool(db, "flac", "title.disable_bitrate_update", &flac_cfg.title.disable_bitrate_update);
0dd1ff7e5ba7 [svn] flac 112 plugin: stability fixes and a new option to disable bitrate update in player window during playback (saves cpu, this is the solution for most people playing flac and reporting high cpu usage)
giacomo
parents: 490
diff changeset
243
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
244 if(!bmp_cfg_db_get_string(db, "flac", "title.tag_format", &flac_cfg.title.tag_format))
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
245 flac_cfg.title.tag_format = g_strdup("%p - %t");
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
246
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
247 bmp_cfg_db_get_bool(db, "flac", "title.convert_char_set", &flac_cfg.title.convert_char_set);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
248
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
249 if(!bmp_cfg_db_get_string(db, "flac", "title.user_char_set", &flac_cfg.title.user_char_set))
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
250 flac_cfg.title.user_char_set = FLAC_plugin__charset_get_current();
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
251
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
252 /* replaygain */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
253
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
254 bmp_cfg_db_get_bool(db, "flac", "output.replaygain.enable", &flac_cfg.output.replaygain.enable);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
255
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
256 bmp_cfg_db_get_bool(db, "flac", "output.replaygain.album_mode", &flac_cfg.output.replaygain.album_mode);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
257
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
258 if(!bmp_cfg_db_get_int(db, "flac", "output.replaygain.preamp", &flac_cfg.output.replaygain.preamp))
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
259 flac_cfg.output.replaygain.preamp = 0;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
260
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
261 bmp_cfg_db_get_bool(db, "flac", "output.replaygain.hard_limit", &flac_cfg.output.replaygain.hard_limit);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
262
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
263 bmp_cfg_db_get_bool(db, "flac", "output.resolution.normal.dither_24_to_16", &flac_cfg.output.resolution.normal.dither_24_to_16);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
264 bmp_cfg_db_get_bool(db, "flac", "output.resolution.replaygain.dither", &flac_cfg.output.resolution.replaygain.dither);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
265
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
266 if(!bmp_cfg_db_get_int(db, "flac", "output.resolution.replaygain.noise_shaping", &flac_cfg.output.resolution.replaygain.noise_shaping))
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
267 flac_cfg.output.resolution.replaygain.noise_shaping = 1;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
268
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
269 if(!bmp_cfg_db_get_int(db, "flac", "output.resolution.replaygain.bps_out", &flac_cfg.output.resolution.replaygain.bps_out))
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
270 flac_cfg.output.resolution.replaygain.bps_out = 16;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
271
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
272 /* stream */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
273
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
274 bmp_cfg_db_get_int(db, "flac", "stream.http_buffer_size", &flac_cfg.stream.http_buffer_size);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
275 bmp_cfg_db_get_int(db, "flac", "stream.http_prebuffer", &flac_cfg.stream.http_prebuffer);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
276 bmp_cfg_db_get_bool(db, "flac", "stream.save_http_stream", &flac_cfg.stream.save_http_stream);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
277 if (!bmp_cfg_db_get_string(db, "flac", "stream.save_http_path", &flac_cfg.stream.save_http_path) ||
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
278 ! *flac_cfg.stream.save_http_path) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
279 /* TODO: Is this a memory leak ?? */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
280 /*
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
281 if (flac_cfg.stream.save_http_path)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
282 g_free (flac_cfg.stream.save_http_path);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
283 */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
284 flac_cfg.stream.save_http_path = homedir();
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
285 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
286 bmp_cfg_db_get_bool(db, "flac", "stream.cast_title_streaming", &flac_cfg.stream.cast_title_streaming);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
287 bmp_cfg_db_get_bool(db, "flac", "stream.use_udp_channel", &flac_cfg.stream.use_udp_channel);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
288
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
289 init_decoder_func_tables();
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
290 decoder_func_table_ = DECODER_FUNCS [DECODER_FILE];
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
291 decoder_ = decoder_func_table_ -> new_decoder();
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
292
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
293 bmp_cfg_db_get_bool(db, NULL, "use_proxy", &flac_cfg.stream.use_proxy);
207
063e31ae8f92 [svn] Properly zero out proxy configuration strings if no value is retrieved, otherwise we crash and burn on shutdown.
chainsaw
parents: 104
diff changeset
294 if(!bmp_cfg_db_get_string(db, NULL, "proxy_host", &flac_cfg.stream.proxy_host))
063e31ae8f92 [svn] Properly zero out proxy configuration strings if no value is retrieved, otherwise we crash and burn on shutdown.
chainsaw
parents: 104
diff changeset
295 flac_cfg.stream.proxy_host = NULL;
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
296 bmp_cfg_db_get_string(db, NULL, "proxy_port", &tmp);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
297
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
298 if (tmp != NULL)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
299 flac_cfg.stream.proxy_port = atoi(tmp);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
300
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
301 bmp_cfg_db_get_bool(db, NULL, "proxy_use_auth", &flac_cfg.stream.proxy_use_auth);
207
063e31ae8f92 [svn] Properly zero out proxy configuration strings if no value is retrieved, otherwise we crash and burn on shutdown.
chainsaw
parents: 104
diff changeset
302 if(!bmp_cfg_db_get_string(db, NULL, "proxy_user", &flac_cfg.stream.proxy_user))
063e31ae8f92 [svn] Properly zero out proxy configuration strings if no value is retrieved, otherwise we crash and burn on shutdown.
chainsaw
parents: 104
diff changeset
303 flac_cfg.stream.proxy_user = NULL;
063e31ae8f92 [svn] Properly zero out proxy configuration strings if no value is retrieved, otherwise we crash and burn on shutdown.
chainsaw
parents: 104
diff changeset
304 if(!bmp_cfg_db_get_string(db, NULL, "proxy_pass", &flac_cfg.stream.proxy_pass))
063e31ae8f92 [svn] Properly zero out proxy configuration strings if no value is retrieved, otherwise we crash and burn on shutdown.
chainsaw
parents: 104
diff changeset
305 flac_cfg.stream.proxy_pass = NULL;
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
306
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
307 bmp_cfg_db_close(db);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
308 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
309
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
310 int FLAC_XMMS__is_our_file_from_vfs( gchar * filename , VFSFile * vfsfile )
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
311 {
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
312 gchar magic_bytes[4];
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
313
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
314 if ( vfsfile == NULL )
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
315 return 0;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
316
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
317 if ( vfs_fread( magic_bytes , 1 , 4 , vfsfile ) != 4 )
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
318 return 0;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
319
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
320 if ( !strncmp( magic_bytes , "fLaC" , 4 ) )
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
321 return 1;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
322 else
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
323 return 0;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
324 }
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
325
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
326 int FLAC_XMMS__is_our_file(char *filename)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
327 {
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
328 VFSFile *vfsfile;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
329 gint result = 0;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
330
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
331 vfsfile = vfs_fopen( filename , "rb" );
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
332
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
333 if ( vfsfile == NULL ) return 0;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
334
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
335 result = FLAC_XMMS__is_our_file_from_vfs( filename , vfsfile );
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
336
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
337 vfs_fclose( vfsfile );
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
338
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
339 return result;
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
340 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
341
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
342 void FLAC_XMMS__play_file(char *filename)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
343 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
344 sample_buffer_first_ = sample_buffer_last_ = 0;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
345 audio_error_ = false;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
346 file_info_.abort_flag = false;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
347 file_info_.is_playing = false;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
348 file_info_.eof = false;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
349 file_info_.play_thread_open = false;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
350 file_info_.has_replaygain = false;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
351
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
352 if(decoder_ == 0)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
353 return;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
354
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
355 if(!safe_decoder_init_(filename, &decoder_, &decoder_func_table_))
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
356 return;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
357
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
358 if(file_info_.has_replaygain && flac_cfg.output.replaygain.enable) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
359 if(flac_cfg.output.resolution.replaygain.bps_out == 8) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
360 file_info_.sample_format = FMT_U8;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
361 file_info_.sample_format_bytes_per_sample = 1;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
362 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
363 else if(flac_cfg.output.resolution.replaygain.bps_out == 16) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
364 file_info_.sample_format = (is_big_endian_host_) ? FMT_S16_BE : FMT_S16_LE;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
365 file_info_.sample_format_bytes_per_sample = 2;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
366 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
367 else {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
368 /*@@@ need some error here like wa2: MessageBox(mod_.hMainWindow, "ERROR: plugin can only handle 8/16-bit samples\n", "ERROR: plugin can only handle 8/16-bit samples", 0); */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
369 fprintf(stderr, "libxmms-flac: can't handle %d bit output\n", flac_cfg.output.resolution.replaygain.bps_out);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
370 decoder_func_table_ -> safe_decoder_finish(decoder_);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
371 return;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
372 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
373 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
374 else {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
375 if(file_info_.bits_per_sample == 8) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
376 file_info_.sample_format = FMT_U8;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
377 file_info_.sample_format_bytes_per_sample = 1;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
378 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
379 else if(file_info_.bits_per_sample == 16 || (file_info_.bits_per_sample == 24 && flac_cfg.output.resolution.normal.dither_24_to_16)) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
380 file_info_.sample_format = (is_big_endian_host_) ? FMT_S16_BE : FMT_S16_LE;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
381 file_info_.sample_format_bytes_per_sample = 2;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
382 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
383 else {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
384 /*@@@ need some error here like wa2: MessageBox(mod_.hMainWindow, "ERROR: plugin can only handle 8/16-bit samples\n", "ERROR: plugin can only handle 8/16-bit samples", 0); */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
385 fprintf(stderr, "libxmms-flac: can't handle %d bit output\n", file_info_.bits_per_sample);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
386 decoder_func_table_ -> safe_decoder_finish(decoder_);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
387 return;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
388 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
389 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
390 FLAC__replaygain_synthesis__init_dither_context(&file_info_.dither_context, file_info_.sample_format_bytes_per_sample * 8, flac_cfg.output.resolution.replaygain.noise_shaping);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
391 file_info_.is_playing = true;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
392
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
393 if(flac_ip.output->open_audio(file_info_.sample_format, file_info_.sample_rate, file_info_.channels) == 0) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
394 audio_error_ = true;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
395 decoder_func_table_ -> safe_decoder_finish(decoder_);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
396 return;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
397 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
398
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
399 file_info_.title = flac_format_song_title(filename);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
400 flac_ip.set_info(file_info_.title, file_info_.length_in_msec, file_info_.sample_rate * file_info_.channels * file_info_.bits_per_sample, file_info_.sample_rate, file_info_.channels);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
401
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
402 file_info_.seek_to_in_sec = -1;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
403 file_info_.play_thread_open = true;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
404 decode_thread_ = g_thread_create((GThreadFunc)play_loop_, NULL, TRUE, NULL);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
405 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
406
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
407 void FLAC_XMMS__stop()
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
408 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
409 if(file_info_.is_playing) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
410 file_info_.is_playing = false;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
411 if(file_info_.play_thread_open) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
412 file_info_.play_thread_open = false;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
413 g_thread_join(decode_thread_);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
414 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
415 flac_ip.output->close_audio();
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
416 decoder_func_table_ -> safe_decoder_finish (decoder_);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
417 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
418 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
419
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
420 void FLAC_XMMS__pause(short p)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
421 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
422 flac_ip.output->pause(p);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
423 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
424
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
425 void FLAC_XMMS__seek(int time)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
426 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
427 if (decoder_func_table_->seekable) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
428 file_info_.seek_to_in_sec = time;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
429 file_info_.eof = false;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
430
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
431 while(file_info_.seek_to_in_sec != -1)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
432 xmms_usleep(10000);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
433 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
434 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
435
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
436 int FLAC_XMMS__get_time()
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
437 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
438 if(audio_error_)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
439 return -2;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
440 if(!file_info_.is_playing || (file_info_.eof && !flac_ip.output->buffer_playing()))
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
441 return -1;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
442 else
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
443 return flac_ip.output->output_time();
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
444 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
445
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
446 void FLAC_XMMS__cleanup()
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
447 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
448 g_free(flac_ip.description);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
449 flac_ip.description = NULL;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
450
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
451 if (flac_cfg.title.tag_format) {
492
0dd1ff7e5ba7 [svn] flac 112 plugin: stability fixes and a new option to disable bitrate update in player window during playback (saves cpu, this is the solution for most people playing flac and reporting high cpu usage)
giacomo
parents: 490
diff changeset
452 g_free(flac_cfg.title.tag_format);
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
453 flac_cfg.title.tag_format = NULL;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
454 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
455
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
456 if (flac_cfg.title.user_char_set) {
492
0dd1ff7e5ba7 [svn] flac 112 plugin: stability fixes and a new option to disable bitrate update in player window during playback (saves cpu, this is the solution for most people playing flac and reporting high cpu usage)
giacomo
parents: 490
diff changeset
457 g_free(flac_cfg.title.user_char_set);
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
458 flac_cfg.title.user_char_set = NULL;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
459 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
460
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
461 if (flac_cfg.stream.proxy_host) {
492
0dd1ff7e5ba7 [svn] flac 112 plugin: stability fixes and a new option to disable bitrate update in player window during playback (saves cpu, this is the solution for most people playing flac and reporting high cpu usage)
giacomo
parents: 490
diff changeset
462 g_free(flac_cfg.stream.proxy_host);
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
463 flac_cfg.stream.proxy_host = NULL;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
464 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
465
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
466 if (flac_cfg.stream.proxy_user) {
492
0dd1ff7e5ba7 [svn] flac 112 plugin: stability fixes and a new option to disable bitrate update in player window during playback (saves cpu, this is the solution for most people playing flac and reporting high cpu usage)
giacomo
parents: 490
diff changeset
467 g_free(flac_cfg.stream.proxy_user);
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
468 flac_cfg.stream.proxy_user = NULL;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
469
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
470 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
471
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
472 if (flac_cfg.stream.proxy_pass) {
492
0dd1ff7e5ba7 [svn] flac 112 plugin: stability fixes and a new option to disable bitrate update in player window during playback (saves cpu, this is the solution for most people playing flac and reporting high cpu usage)
giacomo
parents: 490
diff changeset
473 g_free(flac_cfg.stream.proxy_pass);
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
474 flac_cfg.stream.proxy_pass = NULL;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
475 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
476
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
477 decoder_func_table_ -> safe_decoder_delete(decoder_);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
478 decoder_ = 0;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
479 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
480
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
481 void FLAC_XMMS__get_song_info(char *filename, char **title, int *length_in_msec)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
482 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
483 FLAC__StreamMetadata streaminfo;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
484
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
485 if(0 == filename)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
486 filename = "";
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
487
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
488 if(!FLAC__metadata_get_streaminfo(filename, &streaminfo)) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
489 /* @@@ how to report the error? */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
490 if(title) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
491 if (source_to_decoder_type (filename) == DECODER_FILE) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
492 static const char *errtitle = "Invalid FLAC File: ";
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
493 *title = g_malloc(strlen(errtitle) + 1 + strlen(filename) + 1 + 1);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
494 sprintf(*title, "%s\"%s\"", errtitle, filename);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
495 } else {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
496 *title = NULL;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
497 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
498 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
499 if(length_in_msec)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
500 *length_in_msec = -1;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
501 return;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
502 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
503
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
504 if(title) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
505 *title = flac_format_song_title(filename);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
506 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
507 if(length_in_msec)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
508 *length_in_msec = (unsigned)((double)streaminfo.data.stream_info.total_samples / (double)streaminfo.data.stream_info.sample_rate * 1000.0 + 0.5);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
509 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
510
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
511 /***********************************************************************
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
512 * local routines
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
513 **********************************************************************/
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
514
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
515 void *play_loop_(void *arg)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
516 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
517 unsigned written_time_last = 0, bh_index_last_w = 0, bh_index_last_o = BITRATE_HIST_SIZE, blocksize = 1;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
518 FLAC__uint64 decode_position_last = 0, decode_position_frame_last = 0, decode_position_frame = 0;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
519
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
520 (void)arg;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
521
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
522 while(file_info_.is_playing) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
523 if(!file_info_.eof) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
524 while(sample_buffer_last_ - sample_buffer_first_ < SAMPLES_PER_WRITE) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
525 unsigned s;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
526
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
527 s = sample_buffer_last_ - sample_buffer_first_;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
528 if(decoder_func_table_ -> is_eof(decoder_)) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
529 file_info_.eof = true;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
530 break;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
531 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
532 else if (!decoder_func_table_ -> process_single(decoder_)) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
533 /*@@@ this should probably be a dialog */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
534 fprintf(stderr, "libxmms-flac: READ ERROR processing frame\n");
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
535 file_info_.eof = true;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
536 break;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
537 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
538 blocksize = sample_buffer_last_ - sample_buffer_first_ - s;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
539 decode_position_frame_last = decode_position_frame;
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
540 if(!decoder_func_table_->seekable || !FLAC__seekable_stream_decoder_get_decode_position(decoder_, &decode_position_frame))
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
541 decode_position_frame = 0;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
542 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
543 if(sample_buffer_last_ - sample_buffer_first_ > 0) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
544 const unsigned n = min(sample_buffer_last_ - sample_buffer_first_, SAMPLES_PER_WRITE);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
545 int bytes = n * file_info_.channels * file_info_.sample_format_bytes_per_sample;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
546 FLAC__byte *sample_buffer_start = sample_buffer_ + sample_buffer_first_ * file_info_.channels * file_info_.sample_format_bytes_per_sample;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
547 unsigned written_time, bh_index_w;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
548 FLAC__uint64 decode_position;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
549
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
550 sample_buffer_first_ += n;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
551 while(flac_ip.output->buffer_free() < (int)bytes && file_info_.is_playing && file_info_.seek_to_in_sec == -1)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
552 xmms_usleep(10000);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
553 if(file_info_.is_playing && file_info_.seek_to_in_sec == -1)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
554 produce_audio(flac_ip.output->written_time(), file_info_.sample_format,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
555 file_info_.channels, bytes, sample_buffer_start, NULL);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
556
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
557 /* compute current bitrate */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
558
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
559 written_time = flac_ip.output->written_time();
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
560 bh_index_w = written_time / BITRATE_HIST_SEGMENT_MSEC % BITRATE_HIST_SIZE;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
561 if(bh_index_w != bh_index_last_w) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
562 bh_index_last_w = bh_index_w;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
563 decode_position = decode_position_frame - (double)(sample_buffer_last_ - sample_buffer_first_) * (double)(decode_position_frame - decode_position_frame_last) / (double)blocksize;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
564 bitrate_history_[(bh_index_w + BITRATE_HIST_SIZE - 1) % BITRATE_HIST_SIZE] =
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
565 decode_position > decode_position_last && written_time > written_time_last ?
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
566 8000 * (decode_position - decode_position_last) / (written_time - written_time_last) :
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
567 file_info_.sample_rate * file_info_.channels * file_info_.bits_per_sample;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
568 decode_position_last = decode_position;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
569 written_time_last = written_time;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
570 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
571 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
572 else {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
573 file_info_.eof = true;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
574 xmms_usleep(10000);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
575 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
576 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
577 else
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
578 xmms_usleep(10000);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
579 if(decoder_func_table_->seekable && file_info_.seek_to_in_sec != -1) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
580 const double distance = (double)file_info_.seek_to_in_sec * 1000.0 / (double)file_info_.length_in_msec;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
581 unsigned target_sample = (unsigned)(distance * (double)file_info_.total_samples);
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
582 if(FLAC__seekable_stream_decoder_seek_absolute(decoder_, (FLAC__uint64)target_sample)) {
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
583 flac_ip.output->flush(file_info_.seek_to_in_sec * 1000);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
584 bh_index_last_w = bh_index_last_o = flac_ip.output->output_time() / BITRATE_HIST_SEGMENT_MSEC % BITRATE_HIST_SIZE;
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
585 if(!FLAC__seekable_stream_decoder_get_decode_position(decoder_, &decode_position_frame))
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
586 decode_position_frame = 0;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
587 file_info_.seek_to_in_sec = -1;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
588 file_info_.eof = false;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
589 sample_buffer_first_ = sample_buffer_last_ = 0;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
590 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
591 }
492
0dd1ff7e5ba7 [svn] flac 112 plugin: stability fixes and a new option to disable bitrate update in player window during playback (saves cpu, this is the solution for most people playing flac and reporting high cpu usage)
giacomo
parents: 490
diff changeset
592 else if ( !flac_cfg.title.disable_bitrate_update )
0dd1ff7e5ba7 [svn] flac 112 plugin: stability fixes and a new option to disable bitrate update in player window during playback (saves cpu, this is the solution for most people playing flac and reporting high cpu usage)
giacomo
parents: 490
diff changeset
593 {
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
594 /* display the right bitrate from history */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
595 unsigned bh_index_o = flac_ip.output->output_time() / BITRATE_HIST_SEGMENT_MSEC % BITRATE_HIST_SIZE;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
596 if(bh_index_o != bh_index_last_o && bh_index_o != bh_index_last_w && bh_index_o != (bh_index_last_w + 1) % BITRATE_HIST_SIZE) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
597 bh_index_last_o = bh_index_o;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
598 flac_ip.set_info(file_info_.title, file_info_.length_in_msec, bitrate_history_[bh_index_o], file_info_.sample_rate, file_info_.channels);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
599 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
600 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
601 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
602
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
603 decoder_func_table_ -> safe_decoder_finish(decoder_);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
604
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
605 /* are these two calls necessary? */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
606 flac_ip.output->buffer_free();
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
607 flac_ip.output->buffer_free();
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
608
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
609 g_free(file_info_.title);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
610
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
611 g_thread_exit(NULL);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
612 return 0; /* to silence the compiler warning about not returning a value */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
613 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
614
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
615 /*********** File decoder functions */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
616
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
617 static FLAC__bool file_decoder_unset_source(void *decoder)
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
618 {
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
619 if ( file_info_.vfsfile != NULL )
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
620 {
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
621 vfs_fclose( file_info_.vfsfile );
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
622 file_info_.vfsfile = NULL;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
623 }
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
624 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
625
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
626 static void file_decoder_safe_decoder_finish_(void *decoder)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
627 {
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
628 file_decoder_unset_source(decoder);
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
629 if(decoder && FLAC__seekable_stream_decoder_get_state((FLAC__SeekableStreamDecoder *) decoder) != FLAC__SEEKABLE_STREAM_DECODER_UNINITIALIZED)
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
630 FLAC__seekable_stream_decoder_finish((FLAC__SeekableStreamDecoder *) decoder);
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
631 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
632
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
633 static void file_decoder_safe_decoder_delete_(void *decoder)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
634 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
635 if(decoder) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
636 file_decoder_safe_decoder_finish_(decoder);
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
637 FLAC__seekable_stream_decoder_delete( (FLAC__SeekableStreamDecoder *) decoder);
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
638 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
639 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
640
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
641 static FLAC__bool file_decoder_is_eof(void *decoder)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
642 {
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
643 return FLAC__seekable_stream_decoder_get_state((FLAC__SeekableStreamDecoder *) decoder) == FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
644 }
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
645
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
646 static FLAC__bool file_decoder_set_source(void *decoder, const char *filename)
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
647 {
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
648 if ( ( file_info_.vfsfile = vfs_fopen( filename , "rb" ) ) == NULL )
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
649 return false;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
650 else
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
651 return true;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
652 }
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
653
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
654 static FLAC__SeekableStreamDecoderReadStatus file_decoder_read_callback (const FLAC__SeekableStreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
655 {
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
656 file_info_struct *file_info = (file_info_struct *)client_data;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
657 (void) decoder;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
658
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
659 if( *bytes > 0 )
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
660 {
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
661 *bytes = vfs_fread( buffer , sizeof(FLAC__byte) , *bytes , file_info->vfsfile );
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
662 if ( *bytes == 0 )
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
663 return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
664 else
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
665 return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_OK;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
666 }
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
667 else
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
668 return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
669 }
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
670
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
671 static FLAC__SeekableStreamDecoderSeekStatus file_decoder_seek_callback(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
672 {
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
673 file_info_struct *file_info = (file_info_struct *)client_data;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
674 (void) decoder;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
675
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
676 if ( vfs_fseek( file_info->vfsfile , (glong)absolute_byte_offset , SEEK_SET ) < 0 )
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
677 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
678 else
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
679 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
680 }
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
681
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
682 static FLAC__SeekableStreamDecoderTellStatus file_decoder_tell_callback(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
683 {
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
684 file_info_struct *file_info = (file_info_struct *)client_data;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
685 glong pos;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
686 (void)decoder;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
687
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
688 if ( (pos = vfs_ftell(file_info->vfsfile)) < 0 )
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
689 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
690 else
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
691 {
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
692 *absolute_byte_offset = (FLAC__uint64)pos;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
693 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
694 }
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
695 }
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
696
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
697 static FLAC__SeekableStreamDecoderLengthStatus file_decoder_length_callback(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
698 {
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
699 file_info_struct *file_info = (file_info_struct *)client_data;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
700 glong current_pos = 0;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
701 glong length = 0;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
702 (void)decoder;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
703
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
704 current_pos = vfs_ftell(file_info->vfsfile);
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
705 if ( current_pos < 0 )
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
706 return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
707
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
708 if ( vfs_fseek( file_info->vfsfile , 0 , SEEK_END ) < 0 )
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
709 return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
710
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
711 length = vfs_ftell(file_info->vfsfile);
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
712 if ( length < 0 )
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
713 return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
714
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
715 /* put back stream position */
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
716 if ( vfs_fseek( file_info->vfsfile , current_pos , SEEK_SET ) < 0 )
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
717 return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
718 else
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
719 {
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
720 *stream_length = (FLAC__uint64)length;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
721 return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_OK;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
722 }
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
723 }
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
724
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
725 static FLAC__bool file_decoder_eof_callback (const FLAC__SeekableStreamDecoder *decoder, void *client_data)
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
726 {
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
727 file_info_struct *file_info = (file_info_struct *)client_data;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
728 (void)decoder;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
729
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
730 return vfs_feof( file_info->vfsfile );
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
731 }
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
732
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
733 static FLAC__bool file_decoder_init (void *decoder)
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
734 {
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
735 gint result = 0;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
736 FLAC__seekable_stream_decoder_set_read_callback(decoder, file_decoder_read_callback);
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
737 FLAC__seekable_stream_decoder_set_seek_callback(decoder, file_decoder_seek_callback);
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
738 FLAC__seekable_stream_decoder_set_tell_callback(decoder, file_decoder_tell_callback);
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
739 FLAC__seekable_stream_decoder_set_length_callback(decoder, file_decoder_length_callback);
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
740 FLAC__seekable_stream_decoder_set_eof_callback(decoder, file_decoder_eof_callback);
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
741 return FLAC__seekable_stream_decoder_init( (FLAC__SeekableStreamDecoder*) decoder) == FLAC__SEEKABLE_STREAM_DECODER_OK;
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
742 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
743
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
744 static const decoder_funcs_t FILE_DECODER_FUNCTIONS = {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
745 true,
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
746 (void* (*) (void)) FLAC__seekable_stream_decoder_new,
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
747 (FLAC__bool (*) (void *, const char*)) file_decoder_set_source,
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
748 (FLAC__bool (*) (void *)) file_decoder_unset_source,
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
749 (FLAC__bool (*) (void *, FLAC__bool)) FLAC__seekable_stream_decoder_set_md5_checking,
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
750 (FLAC__bool (*) (void *)) FLAC__seekable_stream_decoder_set_metadata_ignore_all,
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
751 (FLAC__bool (*) (void *, FLAC__MetadataType)) FLAC__seekable_stream_decoder_set_metadata_respond,
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
752 (FLAC__bool (*) (void *, WriteCallback)) FLAC__seekable_stream_decoder_set_write_callback,
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
753 (FLAC__bool (*) (void *, MetadataCallback)) FLAC__seekable_stream_decoder_set_metadata_callback,
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
754 (FLAC__bool (*) (void *, ErrorCallback)) FLAC__seekable_stream_decoder_set_error_callback,
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
755 (FLAC__bool (*) (void *, void *)) FLAC__seekable_stream_decoder_set_client_data,
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
756 (FLAC__bool (*) (void *)) file_decoder_init,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
757 (void (*) (void *)) file_decoder_safe_decoder_finish_,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
758 (void (*) (void *)) file_decoder_safe_decoder_delete_,
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
759 (FLAC__bool (*) (void *)) FLAC__seekable_stream_decoder_process_until_end_of_metadata,
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
760 (FLAC__bool (*) (void *)) FLAC__seekable_stream_decoder_process_single,
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
761 file_decoder_is_eof
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
762 };
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
763
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
764 /*********** HTTP decoder functions */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
765
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
766 static gchar *url_ = NULL;
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
767
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
768 static FLAC__bool http_decoder_set_url (void *decoder, const char* url)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
769 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
770 (void) decoder;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
771 url_ = g_strdup (url);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
772 return true;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
773 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
774
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
775 static FLAC__bool http_decoder_unset_url (void *decoder)
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
776 {
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
777 (void) decoder;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
778 if ( url_ != NULL )
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
779 {
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
780 g_free(url_);
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
781 url_ = NULL;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
782 }
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
783 return true;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
784 }
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
785
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
786 static FLAC__StreamDecoderReadStatus http_decoder_read_callback (const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
787 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
788 (void) decoder;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
789 (void) client_data;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
790 *bytes = flac_http_read (buffer, *bytes);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
791 return *bytes ? FLAC__STREAM_DECODER_READ_STATUS_CONTINUE : FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
792 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
793
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
794 static FLAC__bool http_decoder_init (void *decoder)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
795 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
796 flac_http_open (url_, 0);
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
797 http_decoder_unset_url(decoder);
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
798 FLAC__stream_decoder_set_read_callback (decoder, http_decoder_read_callback);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
799 return FLAC__stream_decoder_init( (FLAC__StreamDecoder*) decoder) == FLAC__STREAM_DECODER_SEARCH_FOR_METADATA;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
800 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
801
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
802 static FLAC__bool http_decoder_set_md5_checking (void *decoder, FLAC__bool value)
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
803 {
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
804 return false;
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
805 }
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
806
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
807 static void http_decoder_safe_decoder_finish_(void *decoder)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
808 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
809 if(decoder && FLAC__stream_decoder_get_state((FLAC__StreamDecoder *) decoder) != FLAC__STREAM_DECODER_UNINITIALIZED) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
810 FLAC__stream_decoder_finish((FLAC__StreamDecoder *) decoder);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
811 flac_http_close();
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
812 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
813 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
814
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
815 static void http_decoder_safe_decoder_delete_(void *decoder)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
816 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
817 if(decoder) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
818 http_decoder_safe_decoder_finish_(decoder);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
819 FLAC__stream_decoder_delete( (FLAC__StreamDecoder *) decoder);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
820 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
821 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
822
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
823 static FLAC__bool http_decoder_is_eof(void *decoder)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
824 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
825 return FLAC__stream_decoder_get_state((FLAC__StreamDecoder *) decoder) == FLAC__STREAM_DECODER_END_OF_STREAM;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
826 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
827
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
828 static const decoder_funcs_t HTTP_DECODER_FUNCTIONS = {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
829 false,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
830 (void* (*) (void)) FLAC__stream_decoder_new,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
831 (FLAC__bool (*) (void *, const char*)) http_decoder_set_url,
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
832 (FLAC__bool (*) (void *)) http_decoder_unset_url,
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
833 (FLAC__bool (*) (void *, FLAC__bool)) http_decoder_set_md5_checking,
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
834 (FLAC__bool (*) (void *)) FLAC__stream_decoder_set_metadata_ignore_all,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
835 (FLAC__bool (*) (void *, FLAC__MetadataType)) FLAC__stream_decoder_set_metadata_respond,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
836 (FLAC__bool (*) (void *, WriteCallback)) FLAC__stream_decoder_set_write_callback,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
837 (FLAC__bool (*) (void *, MetadataCallback)) FLAC__stream_decoder_set_metadata_callback,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
838 (FLAC__bool (*) (void *, ErrorCallback)) FLAC__stream_decoder_set_error_callback,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
839 (FLAC__bool (*) (void *, void *)) FLAC__stream_decoder_set_client_data,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
840 (FLAC__bool (*) (void *)) http_decoder_init,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
841 (void (*) (void *)) http_decoder_safe_decoder_finish_,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
842 (void (*) (void *)) http_decoder_safe_decoder_delete_,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
843 (FLAC__bool (*) (void *)) FLAC__stream_decoder_process_until_end_of_metadata,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
844 (FLAC__bool (*) (void *)) FLAC__stream_decoder_process_single,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
845 http_decoder_is_eof
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
846 };
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
847
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
848 static decoder_funcs_t const *decoder_func_table_;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
849
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
850 static void init_decoder_func_tables()
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
851 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
852 DECODER_FUNCS [DECODER_FILE] = & FILE_DECODER_FUNCTIONS;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
853 DECODER_FUNCS [DECODER_HTTP] = & HTTP_DECODER_FUNCTIONS;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
854 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
855
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
856 static decoder_t source_to_decoder_type (const char *source)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
857 {
490
be4cde738a73 [svn] flac 112 plugin: disabled built-in http stream support
giacomo
parents: 489
diff changeset
858 /* NOTE: in Audacious, always use DECODER_FILE to pick files via VFS;
be4cde738a73 [svn] flac 112 plugin: disabled built-in http stream support
giacomo
parents: 489
diff changeset
859 http flac stream support is not used */
be4cde738a73 [svn] flac 112 plugin: disabled built-in http stream support
giacomo
parents: 489
diff changeset
860 return DECODER_FILE;
be4cde738a73 [svn] flac 112 plugin: disabled built-in http stream support
giacomo
parents: 489
diff changeset
861
be4cde738a73 [svn] flac 112 plugin: disabled built-in http stream support
giacomo
parents: 489
diff changeset
862 /* return strncasecmp(source, "http://", 7) ? DECODER_FILE : DECODER_HTTP; */
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
863 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
864
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
865 static void change_decoder_if_needed (decoder_t new_decoder_type, void **decoderp, decoder_funcs_t const ** fntabp)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
866 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
867 const decoder_funcs_t *new_fn_table = DECODER_FUNCS [new_decoder_type];
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
868 if (*fntabp != new_fn_table) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
869 (*fntabp)->safe_decoder_delete(*decoderp);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
870 *fntabp = new_fn_table;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
871 *decoderp = new_fn_table -> new_decoder();
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
872 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
873 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
874
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
875 FLAC__bool safe_decoder_init_(const char *filename, void **decoderp, decoder_funcs_t const ** fntabp)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
876 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
877 if(decoderp == 0 || *decoderp == 0)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
878 return false;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
879
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
880 (*fntabp)->safe_decoder_finish(*decoderp);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
881
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
882 change_decoder_if_needed(source_to_decoder_type(filename), decoderp, fntabp);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
883
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
884 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
885 decoder_funcs_t const *fntab = *fntabp;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
886 void *decoder = *decoderp;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
887
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
888 decoder = *decoderp;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
889 fntab = *fntabp;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
890
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
891 fntab -> set_source(decoder, filename);
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
892 fntab -> set_md5_checking(decoder, false);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
893 fntab -> set_metadata_ignore_all(decoder);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
894 fntab -> set_metadata_respond(decoder, FLAC__METADATA_TYPE_STREAMINFO);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
895 fntab -> set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
896 fntab -> set_write_callback(decoder, write_callback_);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
897 fntab -> set_metadata_callback(decoder, metadata_callback_);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
898 fntab -> set_error_callback(decoder, error_callback_);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
899 fntab -> set_client_data(decoder, &file_info_);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
900 if(!fntab -> decoder_init(decoder))
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
901 {
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
902 fntab -> unset_source(decoder);
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
903 return false;
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
904 }
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
905
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
906 if(!fntab -> process_until_end_of_metadata(decoder))
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
907 {
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
908 fntab -> unset_source(decoder);
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
909 return false;
489
ce4efa148521 [svn] flac 112 plugin: playback and detection use vfs; current situation is pretty similar to the one of flac 113 plugin
giacomo
parents: 372
diff changeset
910 }
104
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
911 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
912
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
913 return true;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
914 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
915
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
916 FLAC__StreamDecoderWriteStatus write_callback_(const void *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
917 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
918 file_info_struct *file_info = (file_info_struct *)client_data;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
919 const unsigned channels = file_info->channels, wide_samples = frame->header.blocksize;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
920 const unsigned bits_per_sample = file_info->bits_per_sample;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
921 FLAC__byte *sample_buffer_start;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
922
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
923 (void)decoder;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
924
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
925 if(file_info->abort_flag)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
926 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
927
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
928 if((sample_buffer_last_ + wide_samples) > (SAMPLE_BUFFER_SIZE / (channels * file_info->sample_format_bytes_per_sample))) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
929 memmove(sample_buffer_, sample_buffer_ + sample_buffer_first_ * channels * file_info->sample_format_bytes_per_sample, (sample_buffer_last_ - sample_buffer_first_) * channels * file_info->sample_format_bytes_per_sample);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
930 sample_buffer_last_ -= sample_buffer_first_;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
931 sample_buffer_first_ = 0;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
932 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
933 sample_buffer_start = sample_buffer_ + sample_buffer_last_ * channels * file_info->sample_format_bytes_per_sample;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
934 if(file_info->has_replaygain && flac_cfg.output.replaygain.enable) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
935 FLAC__replaygain_synthesis__apply_gain(
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
936 sample_buffer_start,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
937 !is_big_endian_host_,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
938 file_info->sample_format_bytes_per_sample == 1, /* unsigned_data_out */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
939 buffer,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
940 wide_samples,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
941 channels,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
942 bits_per_sample,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
943 file_info->sample_format_bytes_per_sample * 8,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
944 file_info->replay_scale,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
945 flac_cfg.output.replaygain.hard_limit,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
946 flac_cfg.output.resolution.replaygain.dither,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
947 &file_info->dither_context
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
948 );
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
949 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
950 else if(is_big_endian_host_) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
951 FLAC__plugin_common__pack_pcm_signed_big_endian(
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
952 sample_buffer_start,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
953 buffer,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
954 wide_samples,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
955 channels,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
956 bits_per_sample,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
957 file_info->sample_format_bytes_per_sample * 8
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
958 );
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
959 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
960 else {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
961 FLAC__plugin_common__pack_pcm_signed_little_endian(
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
962 sample_buffer_start,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
963 buffer,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
964 wide_samples,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
965 channels,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
966 bits_per_sample,
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
967 file_info->sample_format_bytes_per_sample * 8
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
968 );
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
969 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
970
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
971 sample_buffer_last_ += wide_samples;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
972
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
973 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
974 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
975
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
976 void metadata_callback_(const void *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
977 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
978 file_info_struct *file_info = (file_info_struct *)client_data;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
979 (void)decoder;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
980 if(metadata->type == FLAC__METADATA_TYPE_STREAMINFO) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
981 FLAC__ASSERT(metadata->data.stream_info.total_samples < FLAC__U64L(0x100000000)); /* this plugin can only handle < 4 gigasamples */
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
982 file_info->total_samples = (unsigned)(metadata->data.stream_info.total_samples&0xffffffff);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
983 file_info->bits_per_sample = metadata->data.stream_info.bits_per_sample;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
984 file_info->channels = metadata->data.stream_info.channels;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
985 file_info->sample_rate = metadata->data.stream_info.sample_rate;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
986 file_info->length_in_msec = (unsigned)((double)file_info->total_samples / (double)file_info->sample_rate * 1000.0 + 0.5);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
987 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
988 else if(metadata->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
989 double gain, peak;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
990 if(grabbag__replaygain_load_from_vorbiscomment(metadata, flac_cfg.output.replaygain.album_mode, &gain, &peak)) {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
991 file_info->has_replaygain = true;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
992 file_info->replay_scale = grabbag__replaygain_compute_scale_factor(peak, gain, (double)flac_cfg.output.replaygain.preamp, /*prevent_clipping=*/!flac_cfg.output.replaygain.hard_limit);
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
993 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
994 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
995 }
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
996
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
997 void error_callback_(const void *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
998 {
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
999 file_info_struct *file_info = (file_info_struct *)client_data;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
1000 (void)decoder;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
1001 if(status != FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC)
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
1002 file_info->abort_flag = true;
4b31176c198a [svn] - 1.1.2 compatible plugin (I HATE YOU FLAC PEOPLE)
nenolod
parents:
diff changeset
1003 }