Serge wrote:
Баг c ICH6 исправил. Проверь SVN.
Бинарники и исходники выдают ошибку 403.
Как плеер зависает ?
Нет, на ICH6 после исправления set_ICH4 -> set_ICH зависает не плеер, а система целиком. Просто баг имеет место быть и при использовании твоего плеера, и при использовании моего тестового приложения. Короче, дело тут не в пользовательском коде, а в драйвере.
Может там IRQ расшарено ? У тебя последний дистриб ?
Подозреваю, что этот вопрос относится к системе с ICH0. Есть и расшареные IRQ, но я задействовал только те, которые гарантированно никем не используются: 5 и 10. С резервированием и без. Результат всегда был одним и тем же. Кстати, обрати внимание на момент с call [PciApi] в моём предыдущем посте. Я могу освободить ещё пару-тройку IRQ (3, 4 и, кажется, ещё 7). Проверить? Дистрибутив везде последний (с SVN).
SND_OUT работает как waveout.
Вопрос не об этом, а о возвращаемом значении. Она же в твоём инклуде обьявлена не как void. Поэтому я подумал, что, возможно, предусмотрены коды ошибок на случай если функция не сможет перекачать данные по той или иной причине.
64 Кб размер внутреннего буфера.
Фиксированно и меняться в рамках текущей основной версии не будет? Т.е. SND_GETBUFFSIZE всегда будет возвращать 64К, если при SND_CREATE_BUFF вместо размера указать 0, так?
Не совсем понял о какой синхронизации речь.
В движке предусмотрены функции, которые возвращают текущий pattern/order, средние значения громкости в правом и левом каналах и т.д. Все эти функции синхронизируются с текущей позицией в буфере проигрывания посредством очереди, а не в живую. Чтобы эта фишка с очередью давала максимально приближённый результат, необходимо знать размер буфера.
Code: Select all
while(true)
{
генерируем нужное количество семплов в заданом формате
waveout(); //если семплов очень много поток будет блокирован
//пока все данные не будут считаны
};
Сейчас схема такая:
Первым делом вызываем _uFMOD_PlaySong - эта функция распаковывает XM, грузит драйвер, проверяет версию создаёт буфер и заполняет его полностью, после чего возвращает управление. 0 - ошибка, не 0 - всё нормально. В доску отладки при отключенном режиме NODEBUG выводится подробный отчёт.
Потом пользовательский код обязан периодически вызывать функцию _uFMOD_WaveOut, чтобы дозаписать в буфер следующий блок PCM данных. В тестовом приложении я вызываю эту функцию в цикле обработки событий окна.
Есть ещё куча вспомогательных функций:
_uFMOD_StopSong, _uFMOD_GetRowOrder, _uFMOD_GetStats, _uFMOD_SetVolume, _uFMOD_GetTime, _uFMOD_GetTitle, _uFMOD_Pause, _uFMOD_Resume, _uFMOD_Jump2Pattern
Все эти функции можно вызывать в любой момент и из любого потока.
>ICH0
IRQ_LINE equ 10 исправил ?
И 10 и 5...