Эмуляция MSX на плейерах MP4

By cax

Prophet (3736)

Аватар пользователя cax

08-05-2007, 13:15

Есть такая операционка для портативных плейеров, называется Rockbox.
Работает на множестве устройств, включая iPod-ы всех мастей и мою Sansa E260.

Я сейчас работаю над портированием эмулятора fMSX для Rockbox, и уже есть кое-какие реЕсть такая операционка для портативных плейеров, называется Rockbox.
Работает на множестве устройств, включая iPod-ы всех мастей и мою Sansa E260.

Я сейчас работаю над портированием эмулятора fMSX для Rockbox, и уже есть кое-какие результаты. Хотел бы узнать, нужно ли это кому-либо кроме меня ?

Для того, чтобы оставить комментарий, необходимо регистрация или !login

By cax

Prophet (3736)

Аватар пользователя cax

02-06-2007, 11:27

По следам темы про портинг fMSX на Sansa E200 на английской части форума:

fms, если уж мы решили обсуждать fMSX на Sansa в форуме, то я бы предпочёл говорить по-русски :)

На данный момент я наблюдаю вот что: на самом девайсе (в отличие от симулятора девайса на PC) эмуляция идёт медленнее реального времени, и, соответствено, сэмплы вырабатываются медленнее, чем воспроизводятся.

Так что, похоже, пришло время заняться профайлингом и оптимизациями.

By fms

Champion (364)

Аватар пользователя fms

03-06-2007, 15:21

fms, если уж мы решили обсуждать fMSX на Sansa в форуме, то я бы предпочёл говорить по-русски
Ну по-русски так по-русски - нам татарам все равно.

На данный момент я наблюдаю вот что: на самом девайсе (в отличие от симулятора девайса на PC) эмуляция идёт медленнее реального времени, и, соответствено, сэмплы вырабатываются медленнее, чем воспроизводятся.
Хехе, Сахачка, ты забываешь одну вещь: сэмплы в звуковом frameworkе, приходящем с fMSXом, вырабатываются ровно в одном месте - в функции RenderAudio(). И единственными параметрами этой функции являются частоты и громкости звука по каналам. Если ты будешь вызывать эту функцию каждый раз, когда предыдущий аудио буфер кончил играться (то есть в callbackе), то абсолютно никаких проблем с качеством звука у тебя быть не должно. То есть мелодия может играться медленно, но без помех. Так что, попробуй перенести вызов RenderAudio() в callback и проверь что callback у тебя вызывается именно по прерываниям (иначе от всего rockboxовского audio api придется отказаться).

Так что, похоже, пришло время заняться профайлингом и оптимизациями.
Ну, это никогда не помешает, хотя в данном случае проблема видимо не в этом.

By cax

Prophet (3736)

Аватар пользователя cax

03-06-2007, 16:18

Сегодня я поставил обновлённый Рокбокс - в нём что-то починили, и всё стало работать намного быстрее, и несмотря на то, что, как оказалось, у нас есть не 100MHz, а только 75, я уже вижу, что скорости хватает. Но всё-таки я что-то сильно начудачил... в общем, как только упрусь лбом и смогу объяснить чётко в чём затык, сразу отпишусь. Спасибо ещё раз за помощь.

By cax

Prophet (3736)

Аватар пользователя cax

03-06-2007, 19:23

На данный момент имеем: если засунуть в Keyboard() один вызов RenderAudio(GetFreeAudio()), то я слышу утроенный звук - например, при стрельбе - каждый выстрел 3 раза. При отладке видно, что сэмплов недостаёт, и буфер отыгрывается по нескольку раз с одним содержимым.

Если же я вызову RenderAudio 3 раза подряд, то звук получается правильный, но медленный.
Впрочем, на FastForward он звучит даже слегка быстрее, чем надо.
Кстати, совсем не слышны звуковые эффекты (например, в фоновой мелодии Maze Of Galious нет ударных) - похоже я что-то ещё налажал.

By fms

Champion (364)

Аватар пользователя fms

04-06-2007, 09:01

На данный момент имеем: если засунуть в Keyboard() один вызов RenderAudio(GetFreeAudio()), то я слышу утроенный звук - например, при стрельбе - каждый выстрел 3 раза. При отладке видно, что сэмплов недостаёт, и буфер отыгрывается по нескольку раз с одним содержимым. Если же я вызову RenderAudio 3 раза подряд, то звук получается правильный, но медленный.
Впрочем, на FastForward он звучит даже слегка быстрее, чем надо.

Ну понятно. Смотри: проиграв кусок буфера, ты его не чистишь, поэтому если новых данных ты туда записать не успел, то буфер играется снова и снова. А записать туда из Keyboard() оно не успевает.

А теперь решение: как я говорил в прошлый раз, перенеси вызов RenderAudio() в audio callback. Тогда, независимо от эмулятора, твой аудио буфер всегда будет полон. О результатах доложи Smile


Кстати, совсем не слышны звуковые эффекты (например, в фоновой мелодии Maze Of Galious нет ударных) - похоже я что-то ещё налажал.

Видимо что-то с SCC, или же SetSound() не вызваны были (они устанавливают тип звука для каждого канала, по умолчанию это SND_MELODIC). Не заморачивайся этим пока.