есть исходники библиотеки OPN.dll - она эмулирует звуковой чип YM2612, который устанавливался в приставку Sega Mega Drive. использую для организации проигрывания музыки в редакторе для одной игры. все-бы ничего, да только в ней есть два недочета.
1. проигрывание сэмплов - используется PlayDACSample - но если в начале сэмпла была тишина на секунду или две, то тогда процедура теряет интерес к сэмплу и не играет его. даже если потом уже пошли данные. или наоборот - в середине сэмпла скажем тишина на секунду или две - она начало проиграет и все на этом. насколько я понял это отключение нужно было в целях экономии ресурсов и происходило приостанавливание стрима. заккоментировал эти строки в функции FillBuffer
//if (NullSamples >= SampleRate) //{ //NullSamples = 0xFFFFFFFF; //PauseStream(true); // stop the stream if chip isn't used //}
вроде бы запело. хотя теперь видимо приостановки трансляции тишины не происходит. видимо теперь программа будет проигрывать тишину от момента запуска до закрытия. но вроде загрузки процессора в диспетчере задач нет. как было 0, так и осталось.
2. вроде бы библиотека имеет возможность использовать 2 чипа и даже более. мне бы как раз хотелось использовать 2 штуки. "создаю" путем использования функции: OpenOPNDriver(2) - однако создается впечатление, что вместо создания второго чипа происходит увеличение частоты работы первого. звук становится намного выше по тону. не силен я в этом Visual Studio 6.0, и сам язык программирования не мой - как баран на новые ворота смотрю. где этот момент можно поправить? смотрел на функции в библиотеке - есть некая SetOPNOptions - вобще я её не использую, но тут ради эксперимента решил воспользоваться и выяснилось что если указать в ней SetOPNOptions(44100, 0, 0, 0) - это видимо настройки по умолчанию. OpenOPNDriver(1) - играет нормально. OpenOPNDriver(2) - играет с тем завышением. а вот если указать SetOPNOptions(88200, 0, 0, 0), то OpenOPNDriver(2) вроде бы начинает играть как надо, но вроде бы громче, а самое печальное происходит вылет программы. что-то там с памятью. вот где может быть ошибка? хочется уж до ума довести эту часть. а то сейчас проигрываю всего 6 каналов, но там треков может быть до 16 штук по моему. то есть некое динамическое распределение каналов там есть, когда в 6 физических распихивают эти 16 в реальном времени по приоритету и занятости канала. я такое перераспределение не рожу... сложновато. но я мог бы, используя второй чип, играть на 12 каналах - каждая дорожка в своем канале. зная что песня уже была подготовлена для игры на 6 каналах - то играя на 12 звук будет как на 6. сейчас же я просто выкидываю все что после 6 канала идет. мелодия теряет несколько в качестве.
скачать: http://www.emu-land....0;attach=185238
в архиве два ехе файла, которые загружают эту библиотеку и проигрывают звуки. первый эталонный одночиповый, второй двух чиповый, с демонстрацией того завышения. в первом еще сэмпл играет - первый с начала данные идут. второй с тишиной в начале. но с сэмплами не так актуально, так как вроде бы это поправил... хоть и в ущерб производительности наверное. мне бы вторую проблему с этим вторым чипом решить.