Page 25 of 66
Posted: Tue Jul 10, 2007 1:13 am
by Quantum
Serial
У меня раньше тоже были похожие проблемы при проигрывании mp3 с CD в винде, причём на разных приводах. Включил буферизацию в настройках плеера - проблем как не бывало.
Posted: Tue Jul 10, 2007 7:31 am
by Mario79
Serge
Теперь все нормально. Спасибо.
Serial
Драйвер CD\DVD без кэша. Над универсальной системой кэширования работаю в данный момент.
Posted: Tue Jul 10, 2007 7:50 pm
by Quantum
AC97SND научился играть ХМ-файлы
Изменил только ac97wav.c, ac97snd.vcproj. Добавил ufmod-codec.h и ufmod.obj. Serge, отправить тебе это всё на мыло?
Есть пара узких моментов:
1. Т.к. декодер WAV отбрасывает слишком короткие файлы (меньше ~2К), мне пришлось добавить свой декодер перед вавом и мп3, т.е. последовательсность такая: ХМ, WAV, MP3. Это не есть хорошо, т.к. uFMOD не использует никакие сигнатуры (чтоб можно было играть даже битые ХМы). Таким образом, теоретически он может принять как валидный ХМ какой-нибудь WAV или даже MP3 и сильно подвесить систему долго пытаясь загрузить этот самый "ХМ". За возможность вылета бояться не стоит - декодер очень надёжный, но зависания могут иметь место, особенно из-за пункта 2. Желательно сделать последовательность такой: WAV, MP3, XM.
[Добавил: уже прикрутил кеш - п2 не актуален.]
Ааа... Ещё Ваш pe2kos добавил в экзешник около 50Кб сплошных нулей в конце (???)
Posted: Tue Jul 10, 2007 9:07 pm
by DmitrySokolowsky
Прошу прощения, а что такое XM? Никогда не слышал о таком формате.
Posted: Tue Jul 10, 2007 10:37 pm
by Serial
Атауальпа
Вот что-то похожее имхо:
http://ru.wikipedia.org/wiki/MOD
Posted: Tue Jul 10, 2007 11:11 pm
by Serge
Quantum
Сильно извиняюсь. Залил на SVN не тот ac97wav.c
Теперь исправил, заодно пофиксил баг с маленькими файлами.
Исходники присылай. Интересно посмотреть.
Posted: Tue Jul 10, 2007 11:15 pm
by Quantum
Serial
ХМ гораздо совершеннее/современнее МОДа. В общем, к перечисленному в той статье нужно дабавить: многоканальность (до 64х каналов), сжатие сэмплов (дельта, ADPCM, ...), volume & panning envelop'ы, линейка спецэффектов и ещё много чего. Неофициальное описание формата ХМ на английском можно скачать тамже, где и текущая версия библиотеки для Колибри.
Posted: Wed Jul 11, 2007 1:37 am
by Quantum
Serge
))) Теперь получается обратный эффект: один из моих любимых ХМ'ов определяется твоим кодом как WAV
Поэтому последовательность загрузки пока пусть будет такой: MP3, XM, WAV. Тем более что после добавления кеширования даже очень большие файлы обрабатываются моментально. Сейчас отправлю тебе исходники.
Posted: Wed Jul 11, 2007 9:46 am
by Serge
Quantum
У него RIFF заголовок ?
Posted: Wed Jul 11, 2007 11:14 am
by Mario79
Когда исправите все, выложите бинарники для скачивания, а то я, например С компилить не могу и не умею.
Posted: Wed Jul 11, 2007 4:27 pm
by Serge
Quantum
Проверил всё работает, правда у меня екзешник на 4Кб больше.
Замени test_mp3(char *buf) на эту, а то опять будут проблемы с тегами ID3
Code: Select all
DWORD test_mp3(char *buf)
{ unsigned long hdr;
WAVEHEADER whdr;
while (1)
{ if(rd.filepos > 102400)
return 0;
if(!rd.head_read(&rd,&hdr))
return 0;
if(!decode_header(&fr,hdr))
{
if((hdr & 0xffffff00) == 0x49443300)
{
int id3length = 0;
id3length = parse_new_id3(&rd, hdr);
continue;
};
rd.strpos-=3;
rd.stream-=3;
rd.strremain+=3;
continue;
};
break;
};
first_sync = rd.filepos-rd.strremain-4;
whdr.riff_id = 0x46464952;
whdr.riff_format = 0x45564157;
whdr.wFormatTag = 0x01;
whdr.nSamplesPerSec = freqs[fr.sampling_frequency];
whdr.nChannels = 2; //mpginfo.channels;
whdr.wBitsPerSample = 16;
return test_wav(&whdr);
};
Posted: Wed Jul 11, 2007 6:20 pm
by Quantum
Serge
У него RIFF заголовок ?
Нет. Большинство XM'ов начинаются последовательностью "Extended Module: [название композиции]", но далеко не все. Я не разбирался в твоём коде загрузки WAV/MP3, но думаю, что его нужно немного ужесточить, ведь структура WAV и XM очень заметно отличается от MP3. Поэтому то, что из 1000 разных XM'ов один распознался как WAV/MP3 (могу отправить тебе его, но он большой и последовательности "RIFF" в нём нигде нет). Также стандартный виндовый звонок DING.WAV у меня загрузился как MP3. Поэтому пришлось в тестовой версии вынести вперёд загрузку XM, а потом уже - WAV и MP3.
Вероятность того, что какой-нибудь WAV/MP3 окажется "валидным" XM'ом всё-таки очень мала - прецедентов пока не было
Но лучше не рисковать...
Проверил всё работает, правда у меня екзешник на 4Кб больше.
У меня VC++ 2005 Express Edition.
Нашёл баг в pe2kos: если его запускать из папки с длинным путём, пробелами (кавычки я добавлял, естественно) и прочими недосовскими фишками, он тихо завершается, ничего не делая и не выводя даже сообщения об ошибке. Чтоб заставить его работать, пришлось поместить его в C:\VMs\ и файлы проекта скопировать туда же.
И ещё одна странность: запускаю плеер из KFM - дикие тормоза (загрузка CPU - 60%). Другие приложения - аналогично. Запускаю из фара - всё ОК. Как такое может быть? KFM из текущего дистрибутива я не обновлял, правда...
Posted: Wed Jul 11, 2007 9:08 pm
by Serge
Quantum
test_wav проверяет только заголовок поэтому хватит первых 44-х байт. Скорее он определился как mp3. Такое возможно потому что никаких стандартных сигнатур у файлов нет а строки в русской кодировке очень похожи на заголовок mp3 фрейма. Наверное надо вводить контроль по расширению.
pe2kos есть на сайте у diamond-а. Моя версия сделана специально для DOOM и выделяет программам большой стек. А баг связан пробелами в пути к файлу.
В KFM я пока не тестил, для 1024*768 там слишком мелкий шрифт.
Posted: Wed Jul 11, 2007 9:35 pm
by Quantum
Serge
Скорее он определился как mp3.
Видимо, да.
Наверное надо вводить контроль по расширению.
Очень не советую это делать. Во-первых, многие ХМ файлы имеют другие расширения (я встречал .mod, .s3m, вообще без расширения). Во-вторых, я специально добавил расширение .wav ко всем своим XM-файлам, чтоб их можно было открыть плеером. В общем, считаю, что серьёзная программа не должна полагаться на расширения...
Posted: Thu Jul 12, 2007 1:20 pm
by diamond
Quantum wrote:Потом я ещё поменял int 40h на sysenter, но уже в коде своего тестового приложения, а не в твоём плеере. Вот что получилось:
Нельзя просто поменять int 40h на sysenter, хотя бы потому, что sysenter не сохраняет адреса возврата. Аналог системного вызова, основанный на команде sysenter, можно найти в macros.inc (макрос mcall при соответствующем __CPU_type).