aboutsummaryrefslogtreecommitdiffstats
path: root/src/inputPlugins
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2005-12-31 04:11:03 +0000
committerEric Wong <normalperson@yhbt.net>2005-12-31 04:11:03 +0000
commitea5d367ecf00f9ac4a5e8f0d8cc8909538f42640 (patch)
tree306ea7e269c2f6d520dddd2b1d8c5c4366b8ef21 /src/inputPlugins
parent18e5825cae10e3500ff75fdbbb7a768b8387a1c2 (diff)
downloadmpd-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.c42
-rw-r--r--src/inputPlugins/oggflac_plugin.c45
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++);
}
}
}