diff options
author | Eric Wong <normalperson@yhbt.net> | 2005-12-31 04:11:03 +0000 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2005-12-31 04:11:03 +0000 |
commit | ea5d367ecf00f9ac4a5e8f0d8cc8909538f42640 (patch) | |
tree | 306ea7e269c2f6d520dddd2b1d8c5c4366b8ef21 /src/inputPlugins | |
parent | 18e5825cae10e3500ff75fdbbb7a768b8387a1c2 (diff) | |
download | mpd-ea5d367ecf00f9ac4a5e8f0d8cc8909538f42640.tar.gz mpd-ea5d367ecf00f9ac4a5e8f0d8cc8909538f42640.tar.xz mpd-ea5d367ecf00f9ac4a5e8f0d8cc8909538f42640.zip |
r1071@BL4ST: normalperson | 2005-12-30 20:05:16 -0800
merge with trunk:
* potential fix for bug #466 (shank, ALSA)
* Configure fix, so when no glib found it gives a error, and another race
condition fix in the master proces patch. (qball)
* call dropBufferedAudio() when pausing (shank)
* flac_plugin: revert the performance optimization we did a while ago
the performance optimization was broken for big-endian architectures.
mpd-uclinux is doing using a slightly different optimization to flacWrite()
that we may end up using here in the future. (me/qball)
----------------------------------------------------------------------
git-svn-id: https://svn.musicpd.org/mpd/branches/oggflac@3754 09075e82-0dd4-0310-85a5-a0d7c8717e4f
Diffstat (limited to 'src/inputPlugins')
-rw-r--r-- | src/inputPlugins/flac_plugin.c | 42 | ||||
-rw-r--r-- | src/inputPlugins/oggflac_plugin.c | 45 |
2 files changed, 40 insertions, 47 deletions
diff --git a/src/inputPlugins/flac_plugin.c b/src/inputPlugins/flac_plugin.c index 10a12f853..242dc6f22 100644 --- a/src/inputPlugins/flac_plugin.c +++ b/src/inputPlugins/flac_plugin.c @@ -284,11 +284,12 @@ FLAC__StreamDecoderWriteStatus flacWrite(const FLAC__SeekableStreamDecoder *dec, { FlacData * data = (FlacData *)vdata; FLAC__uint32 samples = frame->header.blocksize; - int c_samp; - int c_chan; + FLAC__uint16 u16; + unsigned char * uc; + int c_samp, c_chan, d_samp; + int i; float timeChange; FLAC__uint64 newPosition = 0; - const int bytesPerSample = data->dc->audioFormat.bits/8; timeChange = ((float)samples)/frame->header.sample_rate; data->time+= timeChange; @@ -300,27 +301,22 @@ FLAC__StreamDecoderWriteStatus flacWrite(const FLAC__SeekableStreamDecoder *dec, } data->position = newPosition; - for(c_samp = 0; c_samp < frame->header.blocksize; c_samp++) { - for(c_chan = 0; c_chan < frame->header.channels; c_chan++) { -#ifdef WORDS_BIGENDIAN - memcpy(data->chunk+data->chunk_length, - &buf[c_chan][c_samp]+4-bytesPerSample, - bytesPerSample); -#else - memcpy(data->chunk+data->chunk_length, - &buf[c_chan][c_samp], bytesPerSample); -#endif - data->chunk_length+=bytesPerSample; - - if(FLAC_CHUNK_SIZE-data->chunk_length < bytesPerSample) - { - if(flacSendChunk(data)<0) { - return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; - } - data->chunk_length = 0; - if(data->dc->seek) { - return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; + for(c_samp = d_samp = 0; c_samp < frame->header.blocksize; c_samp++) { + for(c_chan = 0; c_chan < frame->header.channels; + c_chan++, d_samp++) { + u16 = buf[c_chan][c_samp]; + uc = (unsigned char *)&u16; + for(i=0;i<(data->dc->audioFormat.bits/8);i++) { + if(data->chunk_length>=FLAC_CHUNK_SIZE) { + if(flacSendChunk(data)<0) { + return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; + } + data->chunk_length = 0; + if(data->dc->seek) { + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; + } } + data->chunk[data->chunk_length++] = *(uc++); } } } diff --git a/src/inputPlugins/oggflac_plugin.c b/src/inputPlugins/oggflac_plugin.c index a5bce40c7..25f9a3cdb 100644 --- a/src/inputPlugins/oggflac_plugin.c +++ b/src/inputPlugins/oggflac_plugin.c @@ -161,8 +161,10 @@ static FLAC__StreamDecoderWriteStatus oggflacWrite( { FlacData * data = (FlacData *)vdata; FLAC__uint32 samples = frame->header.blocksize; - int c_samp; - int c_chan; + FLAC__uint16 u16; + unsigned char * uc; + int c_samp, c_chan, d_samp; + int i; float timeChange; const int bytesPerSample = data->dc->audioFormat.bits/8; @@ -179,29 +181,24 @@ static FLAC__StreamDecoderWriteStatus oggflacWrite( data->bitRate = ((8.0 * data->bytes_last_read * frame->header.sample_rate) /((float)samples * 1000)) + 0.5; - */ - for(c_samp = 0; c_samp < frame->header.blocksize; c_samp++) { - for(c_chan = 0; c_chan < frame->header.channels; c_chan++) { -#ifdef WORDS_BIGENDIAN - memcpy(data->chunk+data->chunk_length, - &buf[c_chan][c_samp]+4-bytesPerSample, - bytesPerSample); -#else - memcpy(data->chunk+data->chunk_length, - &buf[c_chan][c_samp], - bytesPerSample); -#endif - data->chunk_length+=bytesPerSample; - if ((FLAC_CHUNK_SIZE - data->chunk_length) - < bytesPerSample) - { - if(flacSendChunk(data)<0) { - return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; - } - data->chunk_length = 0; - if(data->dc->seek) { - return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; + */ + + for(c_samp = d_samp = 0; c_samp < frame->header.blocksize; c_samp++) { + for(c_chan = 0; c_chan < frame->header.channels; + c_chan++, d_samp++) { + u16 = buf[c_chan][c_samp]; + uc = (unsigned char *)&u16; + for(i=0;i<(data->dc->audioFormat.bits/8);i++) { + if(data->chunk_length>=FLAC_CHUNK_SIZE) { + if(flacSendChunk(data)<0) { + return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; + } + data->chunk_length = 0; + if(data->dc->seek) { + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; + } } + data->chunk[data->chunk_length++] = *(uc++); } } } |