PDA

Просмотр полной версии : Visual Studio 6.0 и звук


SeregaZ
27.12.2017, 17:58
совершенно забыл спрашивал ли я тут на форуме или нет. пересоздам тему - мало ли вдруг кто подскажет :)

не разбирается ли кто в Visual Studio 6.0? есть исходники одной библиотеки, которая худо бедно эмулирует звуковой чип - FM - для приставки Sega Mega Drive 2. использовал в своем проекте (другой язык программирования) и был щаслив по самые помидоры... НО! в этой библиотеке есть пару маленьких недочетов.

1. для проигрывания аудио сэмплов в ней была предусмотрена PlayDACSample функция. и затык в ней в том, что если в файле сэмпла в течении секунды или двух не помню - идет проигрывание тишины, то тогда проигрывание всего сэмпла не происходит. либо если скажем в сэмпле были две фразы: первая, пауза 2 секунды, вторая - проиграет только первую. на второй отрубится. и вроде бы я нашел где это в коде функции void FillBuffer(WAVE_16BS* Buffer, UINT32 BufferSize) и закомментировал:
if (NullSamples >= SampleRate)
{
//NullSamples = 0xFFFFFFFF;
//PauseStream(true); // stop the stream if chip isn't used
}
после сборки библиотеки и тесте - играет без этой проверки на тишину и нет "съедания" сэмплов. правда как это скажется на производительности... ведь получается что трансляция тишины идет все время работы программы, а не только тогда когда это нужно - то есть существуют данные для проигрывания.

2. главная проблема. использую эту библиотеку для проигрывания треков аудиодрайвера GEMS для игр приставки. этот драйвер с теми или иными модификациями использовался на множестве игр. краткое объяснение: FM каналов на чипе 6 штук. причем один из них - 3 - может работать как обычный, но может и уходить в специальный режим проигрывания. некий Ch3Mode - не объясню что делает, да и не важно. кароче звук там звучит по иному. например противный звук соник танка в игре Dune Battle For Arrakis. так-же 6 канал тоже с прибабахом - может быть как стандартный FM синтезированный звук, а может проигрывать аудио сэмпл. то есть или или. ну кароче 6 дорожек. плюс еще 4 (хотя правильней было бы наверное 3) - шумовых канала PSG. где 3 канала тон, а 1 канал шумовой - шипение, или там скажем тыц тыц тыц от тарелки на барабанах. или короткий шум, который можно воспринять как рабочий барабан. ну не суть... проблема заключается в том, что всего получается 10 каналов в сумме, но по факту дорожек в GEMS может быть 16. просто играются они по приоритету. у кого выше приоритет того и тапки. и там нет порядка, что типа 5 каналов у песни: 1, 2, 5 это FM каналы, а 3 и 4 это PSG. кароче динамическое перераспределение каналов. воспроизвести такую динамическую фигню я не смог. точнее для PSG как-то смог родить. куча грязного кода, и я не представляю сейчас по прошествии года что я там наваял. но работает и довольно таки близко к оригиналу. оооочень грязный код :) для FM все гораздо хуже и родить подобную динамическую фигню я не смогу.

вот тут-то и помогла бы эта библиотека, а именно тот момент, что в ней можно задействовать 2 чипа FM. то есть я смог бы переназначить каналы, идущие в песни четко по их номерам и использовать в двух разных чипах. типа 1,2,3,4,5,6 будут играть соответственно в 1,2,3,4,5,6 канале первого FM. а 7-12 треки в песне в 1-6 канале второго чипа. то есть если скажем в 3 дорожке песни идет на самом деле PSG а не FM - то просто не использовать 3 канал первого чипа. это могло бы поднять мою полифонию до 12 каналов. вместо нынешних 6. то есть сейчас я играю только 6 дорожек из песни. конечно 12 это не все 16 - но 16 трековых песен мне практически не попадалось. так что 12 хватило бы за глаза.

вот это все была преамбула. затык библиотеки в том, что когда там включаешь это самое второе ядро - происходит какая-то неведомая херня и оба ядра начинают играть так, как будто там происходит удвоение частоты работы процессора. звук разительно завышен. в архиве два ехе файла 1 chip.exe и 2 chips.exe. следует собрать дллку в Visual Studio, чтобы она лежала рядом с этими ехешками и запустить эти ехешки. в 1 чиповом при нажатии плей играет солидно, как оно должно звучать. звук выстрела гранатомета из Alien 3. в 2 chips.exe этот звук завышен. там точно те-же параметры, что и в первом - просто включено 2 ядро. всего одна функция разницы и трындец. весь эффект испорчен. если включать 3 ядро - звук еще выше по частоте. и так по нарастающей. как бы исправить это умножение частоты так сказать? нужно чтоб была возможность использовать 2 ядра, и чтоб они работали верно, то есть проигрывали солидно - как полагается.

ScythLab
27.12.2017, 23:06
Вспоминается анекдот "Дяденька! Я знаю, что у вас сломалось."

SeregaZ
28.12.2017, 02:28
подумаешь я ссылку "скачать" забыл приложить :) надо было телепатическими способностями прочитать код.
http://www.emu-land.net/forum/index.php?action=dlattach;topic=78554.0;attach=185 238

ScythLab
28.12.2017, 03:15
Я не про это.
Буковок много и достаточно сложно описано, может не понял детали, но фраза "не разбирается ли кто в Visual Studio 6.0?" и остальное сообщение не очень связано. Здесь нужно разобраться в звуковой библиотеке и изменить алгоритм "сложения" звуковых потоков, это не совсем к с++ относится. Я на отлично знаю Делфи, хорошо знаю с++, но написать библиотеку по сжатию звука в mp3 формат (это просто к примеру) на каком-либо языке не смогу, потому как здесь больше требуется знание математики (ее я тоже нормально знаю, но не на таком уровне).

SeregaZ
28.12.2017, 14:51
и тут меня начинают грызть сомнения... а что если взять и изначально влепить частоту чипа в 2 раза меньше и включить 2 ядро. тогда по идее 2 ядерная конфигурация будет иметь правильные частоты и звук будет проигрываться верно. правда это всегда должны будут быть включены 2 ядра. пойду смотреть где такая частота выставляется...

вторая идея, что приходит в голову - создать копию проекта, добавить ко всем функциям циферку 2, создать вторую библиотеку, и загружать две библиотеки в проект. (сейчас копирование и переименование и импорт 2 библиотеки под другими названиями функций не работает :) видимо функции внутри библиотек, имея одинаковые названия, портят работу друг друга. поэтому надо их внутри тоже переименовать)

Добавлено через 1 час 11 минут
эх... идея с частотой была замечательная :) но теперь происходит вылет программы. а с переименованием всееех функций и констант я погорячился. что-то их там просто дофига :)))