Я испытал нечто подобное.Взгляните на метод progress в AudioStreamer.m
- (double)progress
{
@synchronized(self)
{
if (sampleRate > 0) && ![self isFinishing])
{
if (state != AS_PLAYING && state != AS_PAUSED && state != AS_BUFFERING)
{
return lastProgress;
}
...
}
}
return lastProgress;
}
Теперь причина неправильного отображения прогресса лежит в двух операторах if.Когда ваш AudioStreamer
почти завершен (возможно, когда все данные загружены), он isFinishing
становится истинным, что заставляет его возвращать кэшированное значение для прогресса.Кроме того, состояние стримера становится AS_STOPPING
, что заставляет второй оператор if возвращать lastProgress
.Что вам действительно нужно, так это обновлять ход выполнения до тех пор, пока стример не остановится.
Моя следующая модификация кода делает это, и, похоже, работает нормально.ОДНАКО, учитывая общее качество AudioStreamer и тот факт, что он разработан Мэттом Галлахером, эти операторы if могут быть такими, как они есть по определенной причине.До сих пор у меня не было сбоев или подобных ошибок с моим измененным кодом, но вы должны тщательно протестировать его в своем приложении.Обратите внимание, что, как только стример закончен, я больше не запрашиваю прогресс.Если вы это сделаете, проверьте, работает ли это:)
- (double)progress
{
@synchronized(self)
{
if (sampleRate > 0))
{
if (state != AS_PLAYING && state != AS_PAUSED && state != AS_BUFFERING && state != AS_STOPPING)
{
return lastProgress;
}
...
}
}
return lastProgress;
}