summaryrefslogtreecommitdiff
path: root/src/plugin_winamp2
diff options
context:
space:
mode:
authorJosh Coalson <jcoalson@users.sourceforce.net>2002-08-27 06:02:09 +0000
committerJosh Coalson <jcoalson@users.sourceforce.net>2002-08-27 06:02:09 +0000
commit6c5958beeadd20d69da0dcfbd3e8a480ff2ac11e (patch)
treeb77194e5dc21fbfd1fd2b75d5d7166fc6ebdee7b /src/plugin_winamp2
parentd41726b381bcd3a0dd64a623af9dc06a5bd41bd7 (diff)
downloadflac-6c5958beeadd20d69da0dcfbd3e8a480ff2ac11e.tar.gz
fixes to make consistent with xmms plugin
Diffstat (limited to 'src/plugin_winamp2')
-rw-r--r--src/plugin_winamp2/in_flac.c73
1 files changed, 34 insertions, 39 deletions
diff --git a/src/plugin_winamp2/in_flac.c b/src/plugin_winamp2/in_flac.c
index d1ea71a2..0f126184 100644
--- a/src/plugin_winamp2/in_flac.c
+++ b/src/plugin_winamp2/in_flac.c
@@ -1,10 +1,6 @@
/* in_flac - Winamp2 FLAC input plugin
* Copyright (C) 2000,2001,2002 Josh Coalson
*
- * dithering routine derived from (other GPLed source):
- * mad - MPEG audio decoder
- * Copyright (C) 2000-2001 Robert Leslie
- *
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
@@ -38,8 +34,6 @@
#define FLAC__DO_DITHER
-#define MAX_SUPPORTED_CHANNELS 2
-
typedef struct {
FLAC__byte raw[128];
char title[31];
@@ -66,7 +60,7 @@ typedef struct {
unsigned bits_per_sample;
unsigned channels;
unsigned sample_rate;
- unsigned length_in_ms;
+ unsigned length_in_msec;
} file_info_struct;
static FLAC__bool safe_decoder_init_(const char *infilename, FLAC__FileDecoder *decoder);
@@ -82,8 +76,10 @@ char lastfn_[MAX_PATH]; /* currently playing file (used for getting info on the
int decode_pos_ms_; /* current decoding position, in milliseconds */
int paused_; /* are we paused? */
int seek_needed_; /* if != -1, it is the point that the decode thread should seek to, in ms. */
-FLAC__int32 reservoir_[FLAC__MAX_BLOCK_SIZE * 2/*for overflow*/ * MAX_SUPPORTED_CHANNELS];
-char sample_buffer_[576 * MAX_SUPPORTED_CHANNELS * (24/8) * 2]; /* (24/8) for max bytes per sample, and 2 for who knows what */
+
+#define SAMPLES_PER_WRITE 576
+FLAC__int32 reservoir_[FLAC__MAX_BLOCK_SIZE * 2/*for overflow*/ * FLAC_PLUGIN__MAX_SUPPORTED_CHANNELS];
+char sample_buffer_[SAMPLES_PER_WRITE * FLAC_PLUGIN__MAX_SUPPORTED_CHANNELS * (24/8) * 2]; /* (24/8) for max bytes per sample, and 2 for who knows what */
unsigned wide_samples_in_reservoir_;
static file_info_struct file_info_;
static FLAC__FileDecoder *decoder_;
@@ -245,7 +241,7 @@ void stop()
int getlength()
{
- return (int)file_info_.length_in_ms;
+ return (int)file_info_.length_in_msec;
}
int getoutputtime()
@@ -308,13 +304,17 @@ DWORD WINAPI __stdcall DecodeThread(void *b)
int done = 0;
while(! *((int *)b) ) {
- unsigned channels = file_info_.channels;
- unsigned bits_per_sample = file_info_.bits_per_sample;
- unsigned bytes_per_sample = (bits_per_sample+7)/8;
- unsigned sample_rate = file_info_.sample_rate;
+ const unsigned channels = file_info_.channels;
+ const unsigned bits_per_sample = file_info_.bits_per_sample;
+#ifdef FLAC__DO_DITHER
+ const unsigned target_bps = 16;
+#else
+ const unsigned target_bps = bits_per_sample;
+#endif
+ const unsigned sample_rate = file_info_.sample_rate;
if(seek_needed_ != -1) {
const double distance = (double)seek_needed_ / (double)getlength();
- unsigned target_sample = (unsigned)(distance * (double)file_info_.total_samples);
+ const unsigned target_sample = (unsigned)(distance * (double)file_info_.total_samples);
if(FLAC__file_decoder_seek_absolute(decoder_, (FLAC__uint64)target_sample)) {
decode_pos_ms_ = (int)(distance * (double)getlength());
seek_needed_ = -1;
@@ -329,8 +329,8 @@ DWORD WINAPI __stdcall DecodeThread(void *b)
}
Sleep(10);
}
- else if(mod_.outMod->CanWrite() >= ((int)(576*channels*bytes_per_sample) << (mod_.dsp_isactive()?1:0))) {
- while(wide_samples_in_reservoir_ < 576) {
+ else if(mod_.outMod->CanWrite() >= ((int)(SAMPLES_PER_WRITE*channels*((target_bps+7)/8)) << (mod_.dsp_isactive()?1:0))) {
+ while(wide_samples_in_reservoir_ < SAMPLES_PER_WRITE) {
if(FLAC__file_decoder_get_state(decoder_) == FLAC__FILE_DECODER_END_OF_FILE) {
done = 1;
break;
@@ -346,14 +346,9 @@ DWORD WINAPI __stdcall DecodeThread(void *b)
done = 1;
}
else {
-#ifdef FLAC__DO_DITHER
- const unsigned target_bps = 16;
-#else
- const unsigned target_bps = bits_per_sample;
-#endif
- const unsigned n = min(wide_samples_in_reservoir_, 576);
+ const unsigned n = min(wide_samples_in_reservoir_, SAMPLES_PER_WRITE);
const unsigned delta = n * channels;
- int bytes = (int)FLAC__plugin_common__pack_pcm(sample_buffer_, reservoir_, n, channels, bits_per_sample, target_bps);
+ int bytes = (int)FLAC__plugin_common__pack_pcm_signed_little_endian(sample_buffer_, reservoir_, n, channels, bits_per_sample, target_bps);
unsigned i;
for(i = delta; i < wide_samples_in_reservoir_ * channels; i++)
@@ -477,13 +472,13 @@ void safe_decoder_delete_(FLAC__FileDecoder *decoder)
FLAC__StreamDecoderWriteStatus write_callback_(const FLAC__FileDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
{
- file_info_struct *file_info_ = (file_info_struct *)client_data;
- const unsigned bps = file_info_->bits_per_sample, channels = file_info_->channels, wide_samples = frame->header.blocksize;
+ file_info_struct *file_info = (file_info_struct *)client_data;
+ const unsigned channels = file_info->channels, wide_samples = frame->header.blocksize;
unsigned wide_sample, offset_sample, channel;
(void)decoder;
- if(file_info_->abort_flag)
+ if(file_info->abort_flag)
return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
for(offset_sample = wide_samples_in_reservoir_ * channels, wide_sample = 0; wide_sample < wide_samples; wide_sample++)
@@ -497,38 +492,38 @@ FLAC__StreamDecoderWriteStatus write_callback_(const FLAC__FileDecoder *decoder,
void metadata_callback_(const FLAC__FileDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
{
- file_info_struct *file_info_ = (file_info_struct *)client_data;
+ file_info_struct *file_info = (file_info_struct *)client_data;
(void)decoder;
if(metadata->type == FLAC__METADATA_TYPE_STREAMINFO) {
FLAC__ASSERT(metadata->data.stream_info.total_samples < 0x100000000); /* this plugin can only handle < 4 gigasamples */
- file_info_->total_samples = (unsigned)(metadata->data.stream_info.total_samples&0xffffffff);
- file_info_->bits_per_sample = metadata->data.stream_info.bits_per_sample;
- file_info_->channels = metadata->data.stream_info.channels;
- file_info_->sample_rate = metadata->data.stream_info.sample_rate;
+ file_info->total_samples = (unsigned)(metadata->data.stream_info.total_samples&0xffffffff);
+ file_info->bits_per_sample = metadata->data.stream_info.bits_per_sample;
+ file_info->channels = metadata->data.stream_info.channels;
+ file_info->sample_rate = metadata->data.stream_info.sample_rate;
#ifdef FLAC__DO_DITHER
- if(file_info_->bits_per_sample != 16 && file_info_->bits_per_sample != 24) {
+ if(file_info->bits_per_sample != 16 && file_info->bits_per_sample != 24) {
MessageBox(mod_.hMainWindow, "ERROR: plugin can only handle 16/24-bit samples\n", "ERROR: plugin can only handle 16/24-bit samples", 0);
- file_info_->abort_flag = true;
+ file_info->abort_flag = true;
return;
}
#else
- if(file_info_->bits_per_sample != 8 && file_info_->bits_per_sample != 16 && file_info_->bits_per_sample != 24) {
+ if(file_info->bits_per_sample != 8 && file_info->bits_per_sample != 16 && file_info->bits_per_sample != 24) {
MessageBox(mod_.hMainWindow, "ERROR: plugin can only handle 8/16/24-bit samples\n", "ERROR: plugin can only handle 8/16/24-bit samples", 0);
- file_info_->abort_flag = true;
+ file_info->abort_flag = true;
return;
}
#endif
- file_info_->length_in_ms = file_info_->total_samples * 10 / (file_info_->sample_rate / 100);
+ file_info->length_in_msec = file_info->total_samples * 10 / (file_info->sample_rate / 100);
}
}
void error_callback_(const FLAC__FileDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
{
- file_info_struct *file_info_ = (file_info_struct *)client_data;
+ file_info_struct *file_info = (file_info_struct *)client_data;
(void)decoder;
if(status != FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC)
- file_info_->abort_flag = true;
+ file_info->abort_flag = true;
}
FLAC__bool get_id3v1_tag_(const char *filename, id3v1_struct *tag)