| Разработка и ромхакинг > Ромхакинг и программирование |
| нужна компиляция длл |
| (1/1) |
| SeregaZ:
есть исходник... эээ... черт знает какой язык, исходник эмулятора чипа YM2612 - который Sega Mega Drive. в архиве файлы с расширениями, может кому это подскажет что за язык: OPN_DLL.c OPN_DLL.def OPN_DLL.dsp OPN_DLL.dsw OPN_DLL.h кто шарит, гляньте одним глазом и подскажите как это дело собрать в dll? сам файл этот dll там есть в архиве, НО! в этом коде есть парочка косяков, которые портят всю радость. хотя возможно я просто не правильно делаю... при использовании длл я импортирую только 4 функции, которые мне нужны: OpenOPNDriver - что-то вроде инициализация чипа. в качестве параметра, насколько я понимаю, следует указывать количество чипов, которые будут созданы. CloseOPNDriver - выключает этот самый чип. использую в конце своей программы. OPN_Write - посылает в какой-то регистр какую-то команду. PlayDACSample - поскольку проигрывание сэмплов через посылку данных через регистры OPN_Write буржуйский товарищ сделать не смог, то он добавил эту функцию для возможности проигрывания сэмплов. так вот первая проблема заключается в OpenOPNDriver. при инициализации одного чипа OpenOPNDriver(1) - все работает без проблем. однако мне хотелось бы использовать 2 чипа, поскольку 6 каналов будет не достаточно для проигрывателя. хотелось бы 12 - два по 6. но при указании OpenOPNDriver(2) - происходит какая-то фигня. такое ощущение что частота чипа повышается, то есть звуки становятся писклявее. 3, 4, 5 и так далее - звук все выше и выше. получается вместо увеличения количества чипов эта функция производит разгон чтоль... вот где может быть ошибка в коде? как исправить? вторая проблема связана с PlayDACSample. если аудиосэмпл содержит сразу данные - крики там, пальба - сразу с начала файла, то все играет без проблем. ежели сэмпл имел скажем пару секунд тишины в начале файла, то проигрывание прекращается. буржуйский товарищ делал типа оптимизации чтоль... он так боялся загрузить процессор компьютера, что прикрутил это дурацкое отрубание при тишине в сэмпле. поскольку PlayDACSample должна содержать в своих параметрах размер файла, то хотелось бы чтоб эта функция играла не от начала сэмпла до тишины секундной длительности и отрубалось проигрывание, а чтоб от начала и до конца - по всему размеру сэмпла, даже если весь сэмпл тишина. чтоб не было этого экономного отрубания. в архиве 2 ехешника с моим импортом дллки. один с OpenOPNDriver(1) - кнопка play покажет как должен звучать звук выстрела, используется FM инструмент. второй с OpenOPNDriver(2) - там звук будет искажен, из-за ускорения чтоль... так-же в одночиповом еще две кнопки внизу - одна сэмпл, где данные сразу идут с начала файла. вторая кнопка запускает сэмпл, где в начале примерно на скунду идет тишина, то есть проигрывание прерывается после этого. а должен играть до конца. так что кто разбирается - помогите :) а то в редакторе для дюны проигрыватель играет несколько обрезано, в случае когда дорожек в музыке больше 6 штук. |
| MetalliC:
--- Цитата: SeregaZ от 23 Июль 2017, 14:11:30 ---кто шарит, гляньте одним глазом и подскажите как это дело собрать в dll? --- Конец цитаты --- если по расширению файлов не понятно - это С, проект старенький, для Visual Studio 6.0, хотя можно импортировать проект и в 2010. на более новых версиях VS сходу я думаю собираться уже не будет. вообще всё это кусок МАМЕ, старенького, 6ти-7ми летней давности. |
| krocki:
--- Цитата ---на более новых версиях VS сходу я думаю собираться уже не будет. --- Конец цитаты --- Как говориться новое, не всегда лучше! |
| DrMefistO:
Компиляция ещё нужна? Если что, то вот. |
| SeregaZ:
нужна, но надо еще найти косяки :( а почему размер раздулся раз в десять с 36кб до 341? или оригинальная еще была дополнительно пожата? Добавлено позже: я вроде на рутрекере нашел эту 6.0. поставлю на закачку. Добавлено позже: вроде установилось и что-то там даже собирает и размер 36кб. но: --- Цитата ---opn_dll.c(270) : warning C4761: integral size mismatch in argument; conversion supplied --- Конец цитаты --- угу... и чото сломал. создавать дллку перестало. :blush: Добавлено позже: хотя что-то раздупляю... там надо выбирать дебуг или релиз. мне видимо надо релиз. |
| SeregaZ:
с отрубанием вроде получилось, хотя я не уверен насколько правильно это решение. в коде функции: void FillBuffer(WAVE_16BS* Buffer, UINT32 BufferSize) я закомментировал строчки. то есть получается проигрывание не тормозится... но насколько правильно это решение по отношению к экономии ресурсов - не знаю. как повесить дебаг в этом визуал студио я не в курсе :) так бы посмотреть как часто оно обращается к этому участку. я подозреваю что один раз запустил звук - он будет "играть" тишину до закрытия программы. а мне надо чтоб играл тишину до окончания сэмпла. но вроде диспетчер задач не показывает загрузку приложения. хотя все равно по моему это не совсем верно. --- Код: ---if (NullSamples >= SampleRate) { //NullSamples = 0xFFFFFFFF; //PauseStream(true); // stop the stream if chip isn't used } --- Конец кода --- |
| DrMefistO:
Ты релиз или дебаг смотрел? Плюс, я выставил сборку в статик режиме, чтобы не было зависимостей от рантаймов. Я собирал 17-й студией. |
| SeregaZ:
релиз. дебаг так и вовсе 800 килобайт :) насчет зависимостей ничего не понял... так как быть со вторым чипом то? где-бы в коде это поправить, чтоб небыло того завышения звука? вроде если поставить 88200 вместо 44100 в опциях по тону вроде бы звук становится правильным, но по моему громче и вылетает инвалид мемори аксесс при проигрывании. потом подумал может можно оставить 1 чип, просто увеличить каналы с 6 до 12 - но не понял как ядро команды разбирает. Добавлено позже: то есть включение звука для канала там происходит через регистр $28 - ему шлешь параметр кейон %хххх0000 + номер канала. вот тут я не понял как ядро разбирает эту команду, чтоб раздуплить какой канал играть. ведь если я количество каналов увеличу - нужно и этот момент тоже написать. не понятно блин. не понятно, но нужна эта опция... хочу чтоб играло солидно все каналы, а не мои нынешние огрызки :) |
| Навигация |
| Главная страница сообщений |