diff options
author | Josh Coalson <jcoalson@users.sourceforce.net> | 2002-08-27 06:02:09 +0000 |
---|---|---|
committer | Josh Coalson <jcoalson@users.sourceforce.net> | 2002-08-27 06:02:09 +0000 |
commit | 6c5958beeadd20d69da0dcfbd3e8a480ff2ac11e (patch) | |
tree | b77194e5dc21fbfd1fd2b75d5d7166fc6ebdee7b /src/plugin_winamp2 | |
parent | d41726b381bcd3a0dd64a623af9dc06a5bd41bd7 (diff) | |
download | flac-6c5958beeadd20d69da0dcfbd3e8a480ff2ac11e.tar.gz |
fixes to make consistent with xmms plugin
Diffstat (limited to 'src/plugin_winamp2')
-rw-r--r-- | src/plugin_winamp2/in_flac.c | 73 |
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) |