Der Audioplayer stoppt nach jedem FLAC-File in der Playlist. Bug oder Feature?
(FLAC ist selbstverständlich mit kompiliert...)
Audioplayer arbeitet FLAC Playliste nicht ab
-
- Interessierter
- Beiträge: 48
- Registriert: Freitag 9. Januar 2009, 18:52
-
- Interessierter
- Beiträge: 48
- Registriert: Freitag 9. Januar 2009, 18:52
Re: Audioplayer arbeitet FLAC Playliste nicht ab
Problem war/ist, das der Flacdecoder das end-of-file nicht erkennt, d.h. das Stück niemals beendet.
Hier ist der erste Brute-Force Patch, der dieses Verhalten korrigiert.
Allerdings scheint dies nur ein Teil der Probleme zu sein. Nach dem einige FLAC gespielt werden, bekommen alle weiteren Musikstücke einen deutlich hörbaren Jitter - unabhängig vom Codec-Typ - auch die MP3s. Interessanterweise ändern sich weder Speicherbedarf noch CPU-Last merklich (Neutrino zeigt ca 50% bei FLAC, ca. 75% bei MP3).
Hier ist der erste Brute-Force Patch, der dieses Verhalten korrigiert.
Code: Alles auswählen
Index: apps/tuxbox/neutrino/src/driver/audiodec/flacdec.cpp
===================================================================
RCS file: /cvs/tuxbox/apps/tuxbox/neutrino/src/driver/audiodec/flacdec.cpp,v
retrieving revision 1.1
diff -u -u -r1.1 flacdec.cpp
--- a/apps/tuxbox/neutrino/src/driver/audiodec/flacdec.cpp 19 Sep 2007 19:55:42 -0000 1.1
+++ b/apps/tuxbox/neutrino/src/driver/audiodec/flacdec.cpp 3 Mar 2009 15:58:12 -0000
@@ -474,16 +474,23 @@
*state=PLAY;
}
}
-
+ if (FLAC__stream_decoder_get_state(mFlacDec) == FLAC__STREAM_DECODER_END_OF_STREAM) {
+ rval = false;
+ break;
+ }
rval = FLAC__stream_decoder_process_single(mFlacDec);
// TODO: calculate time_played from the actual file position so that REW/FF actions will be included
*time_played = (mSamplesProcessed * (mLengthInMsec/1000)) / mTotalSamples;
- } while (rval == FLAC__stream_decoder_process_single(mFlacDec) && *state!=STOP_REQ && Status==OK);
+ } while (rval && *state!=STOP_REQ && Status==OK);
// let buffer run dry
- while(rval==0 && *state!=STOP_REQ && Status==OK /* && mReadSlot != mWriteSlot*/)
+ printf("let buffer run dry\n");
+ while (rval==true && *state!=STOP_REQ && Status==OK /* && mReadSlot != mWriteSlot*/)
+ {
+ printf("...drying - *state=%x, Status=%x\n", *state, Status);
usleep(100000);
+ }
/* clean up the junk from the party */
if (mMetadata)
-
- CDK-Experte
- Beiträge: 4335
- Registriert: Donnerstag 3. April 2008, 14:05