sound, SB, AC97 и другое

Drivers for sound cards
  • Serge
    Теперь все нормально. Спасибо.

    Serial
    Драйвер CD\DVD без кэша. Над универсальной системой кэширования работаю в данный момент.
  • 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Кб сплошных нулей в конце (???)
    Last edited by Quantum on Tue Jul 10, 2007 11:06 pm, edited 1 time in total.
  • Прошу прощения, а что такое XM? Никогда не слышал о таком формате.
  • Атауальпа

    Вот что-то похожее имхо:
    http://ru.wikipedia.org/wiki/MOD
  • Quantum
    Сильно извиняюсь. Залил на SVN не тот ac97wav.c
    Теперь исправил, заодно пофиксил баг с маленькими файлами.
    Исходники присылай. Интересно посмотреть.
  • Serial

    ХМ гораздо совершеннее/современнее МОДа. В общем, к перечисленному в той статье нужно дабавить: многоканальность (до 64х каналов), сжатие сэмплов (дельта, ADPCM, ...), volume & panning envelop'ы, линейка спецэффектов и ещё много чего. Неофициальное описание формата ХМ на английском можно скачать тамже, где и текущая версия библиотеки для Колибри.
  • Serge

    :)))) Теперь получается обратный эффект: один из моих любимых ХМ'ов определяется твоим кодом как WAV :) Поэтому последовательность загрузки пока пусть будет такой: MP3, XM, WAV. Тем более что после добавления кеширования даже очень большие файлы обрабатываются моментально. Сейчас отправлю тебе исходники.
  • Quantum

    У него RIFF заголовок ?
  • Когда исправите все, выложите бинарники для скачивания, а то я, например С компилить не могу и не умею.
  • 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);
    };
  • 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 из текущего дистрибутива я не обновлял, правда...
  • Quantum

    test_wav проверяет только заголовок поэтому хватит первых 44-х байт. Скорее он определился как mp3. Такое возможно потому что никаких стандартных сигнатур у файлов нет а строки в русской кодировке очень похожи на заголовок mp3 фрейма. Наверное надо вводить контроль по расширению.
    pe2kos есть на сайте у diamond-а. Моя версия сделана специально для DOOM и выделяет программам большой стек. А баг связан пробелами в пути к файлу.

    В KFM я пока не тестил, для 1024*768 там слишком мелкий шрифт.
  • Serge
    Скорее он определился как mp3.
    Видимо, да.
    Наверное надо вводить контроль по расширению.
    Очень не советую это делать. Во-первых, многие ХМ файлы имеют другие расширения (я встречал .mod, .s3m, вообще без расширения). Во-вторых, я специально добавил расширение .wav ко всем своим XM-файлам, чтоб их можно было открыть плеером. В общем, считаю, что серьёзная программа не должна полагаться на расширения...
  • Quantum wrote:Потом я ещё поменял int 40h на sysenter, но уже в коде своего тестового приложения, а не в твоём плеере. Вот что получилось:
    Нельзя просто поменять int 40h на sysenter, хотя бы потому, что sysenter не сохраняет адреса возврата. Аналог системного вызова, основанный на команде sysenter, можно найти в macros.inc (макрос mcall при соответствующем __CPU_type).
  • Who is online

    Users browsing this forum: No registered users and 21 guests