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).