Ogg files can be tagged to be automatically looping, this setting always overrides the MediaPlayer's setLooping setting.

Change-Id: Ifb564c6cdf6137eac14869f9ca7d471f05a5556a
related-to-bug: 2974691
This commit is contained in:
Andreas Huber
2010-09-03 14:09:21 -07:00
parent dc243482d6
commit 9fee0b2a02
4 changed files with 18 additions and 4 deletions

View File

@@ -92,6 +92,8 @@ enum {
kKeyNotRealTime = 'ntrt', // bool (int32_t)
// Ogg files can be tagged to be automatically looping...
kKeyAutoLoop = 'autL', // bool (int32_t)
};
enum {

View File

@@ -330,6 +330,13 @@ status_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) {
} else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) {
setAudioSource(extractor->getTrack(i));
haveAudio = true;
sp<MetaData> fileMeta = extractor->getMetaData();
int32_t loop;
if (fileMeta != NULL
&& fileMeta->findInt32(kKeyAutoLoop, &loop) && loop != 0) {
mFlags |= AUTO_LOOPING;
}
}
if (haveAudio && haveVideo) {
@@ -587,7 +594,7 @@ void AwesomePlayer::onStreamDone() {
return;
}
if (mFlags & LOOPING) {
if (mFlags & (LOOPING | AUTO_LOOPING)) {
seekTo_l(0);
if (mVideoSource != NULL) {
@@ -1560,7 +1567,7 @@ status_t AwesomePlayer::suspend() {
state->mUriHeaders = mUriHeaders;
state->mFileSource = mFileSource;
state->mFlags = mFlags & (PLAYING | LOOPING | AT_EOS);
state->mFlags = mFlags & (PLAYING | AUTO_LOOPING | LOOPING | AT_EOS);
getPosition(&state->mPositionUs);
if (mLastVideoBuffer) {
@@ -1621,7 +1628,7 @@ status_t AwesomePlayer::resume() {
seekTo_l(state->mPositionUs);
mFlags = state->mFlags & (LOOPING | AT_EOS);
mFlags = state->mFlags & (AUTO_LOOPING | LOOPING | AT_EOS);
if (state->mLastVideoFrame && mISurface != NULL) {
mVideoRenderer =

View File

@@ -592,6 +592,7 @@ void MyVorbisExtractor::parseFileMetaData() {
{ "DATE", kKeyDate },
{ "LYRICIST", kKeyWriter },
{ "METADATA_BLOCK_PICTURE", kKeyAlbumArt },
{ "ANDROID_LOOP", kKeyAutoLoop },
};
for (int i = 0; i < mVc.comments; ++i) {
@@ -605,12 +606,15 @@ void MyVorbisExtractor::parseFileMetaData() {
extractAlbumArt(
&comment[tagLen + 1],
mVc.comment_lengths[i] - tagLen - 1);
} else if (kMap[j].mKey == kKeyAutoLoop) {
if (!strcasecmp(&comment[tagLen + 1], "true")) {
mFileMeta->setInt32(kKeyAutoLoop, true);
}
} else {
mFileMeta->setCString(kMap[j].mKey, &comment[tagLen + 1]);
}
}
}
}
#if 0

View File

@@ -106,6 +106,7 @@ private:
CACHE_UNDERRUN = 128,
AUDIO_AT_EOS = 256,
VIDEO_AT_EOS = 512,
AUTO_LOOPING = 1024,
};
mutable Mutex mLock;