2014-03-05 2 views
2

Я написал музыкальный плеер с использованием OpenSL ES. Он отлично работает, кроме одного предупреждающего сообщения, выходящего из библиотеки libOpenSLES. Вот сообщение.Сообщение «Missed SL_PLAYEVENT_HEADATNEWPOS for position»

03-05 00:10:15.367: W/libOpenSLES(12055): Missed SL_PLAYEVENT_HEADATNEWPOS for position 7000; current position 724009 
... 
03-05 00:10:27.226: W/libOpenSLES(12055): Missed SL_PLAYEVENT_HEADATNEWPOS for position 329015; current position 816013 

Это происходит, когда я ищу медиа-трек. Иногда я могу искать без предупреждения, иногда сообщение появляется в журнале.

Реализация очень проста. При инициализации я подбираю контроль поиска.

SLObjectItf decoder; 
SLSeekItf seek; 
... 

SLresult result = (*decoder)->GetInterface(decoder, SL_IID_SEEK, &seek); 

Затем позже, когда пользователь изменяет отслеживать положение, я называю SetPosition метод следующим образом.

SLresult result = (*seek)->SetPosition(seek, position, SL_SEEKMODE_ACCURATE); 

Оба вызова возвращают результат успеха, а также изменение положения работает все время. Единственная проблема - это предупреждающее сообщение, упомянутое выше.

Любые идеи, почему это сообщение приходит и как его избежать?

Update:

Хотя половина щедрот автоматически назначается, вопрос не ответил. Мы не знаем, что вызывает проблему и как ее избежать.

ответ

2

Быстрый Google части этого сообщения журнала нашел следующий код надрез, с вашим журналом печатью в середине здесь, (complete source):

// nextVirtualMarkerMs will be set to the position of the next upcoming virtual marker 
    int32_t nextVirtualMarkerMs; 
    if (mObservedPositionMs <= virtualMarkerMs && virtualMarkerMs <= positionMs) { 
     // we did pass through the virtual marker, now compute the next virtual marker 
     mDeliveredNewPosMs = virtualMarkerMs; 
     nextVirtualMarkerMs = virtualMarkerMs + mPositionUpdatePeriodMs; 
     // re-synchronize if we missed an update 
     if (nextVirtualMarkerMs <= positionMs) { 
      SL_LOGW("Missed SL_PLAYEVENT_HEADATNEWPOS for position %d; current position %d", 
        nextVirtualMarkerMs, positionMs); 
      // try to catch up by setting next goal to current position plus update period 
      mDeliveredNewPosMs = positionMs; 
      nextVirtualMarkerMs = positionMs + mPositionUpdatePeriodMs; 
     } 
     notify(PLAYEREVENT_PLAY, (int32_t) SL_PLAYEVENT_HEADATNEWPOS, true /*async*/); 

Если вы ищете пройти определенный момент есть некоторые догоняют (переход), и, возможно, обновление было пропущено, вот что говорит журнал, что нам нужно повторно синхронизировать позицию маркера.

Update Весь код надрез выше для расчета ONESHOT (стабильное временное состояние) Время паузы, если интерпретировать код правильный, определение oneshot, row 116:

// deferred (non-0 timeout) handler for SL_PLAYEVENT_* 
    // As used here, "one-shot" is the software equivalent of a "retriggerable monostable 
    // multivibrator" from electronics. Briefly, a one-shot is a timer that can be triggered 
    // to fire at some point in the future. It is "retriggerable" because while the timer 
    // is active, it is possible to replace the current timeout value by a new value. 
    // This is done by cancelling the current timer (using a generation count), 
    // and then posting another timer with the new desired value. 

И вы получите сообщение журнала из-за прыжка на часто для кода, чтобы догнать, я думаю. Так что старайтесь не прыгать так часто? Кстати, это журнал предупреждений, в следующий раз этот путь будет догонять.

+0

У меня также есть исходный код, и я интерпретировал комментарии так же, как и вы. Вопрос в том, как этого избежать? –

+0

Обновлен мой ответ, извините за то, что не прочитал вопрос в полном объеме. – Magnus

+0

Спасибо, что посмотрели на это. Это происходит даже тогда, когда я устанавливаю позицию только один раз. Я подозреваю, что это связано с тем, что когда я вызываю SetPosition, поток событий или декодера блокируется некоторое время. Это приводит к устаревшему состоянию позиции в проигрывателе. Несмотря на то, что это просто предупреждение и репозиционирование, - как я уже упоминал в вопросе, это предупреждение, которое не появляется в стандартном музыкальном проигрывателе, который использует тот же API. У меня просто плохое чувство, что я использую что-то не совсем правильное или каким-то образом оно предназначалось прежде всего для использования, вот почему вопрос. –

Смежные вопросы