{"id":48,"date":"2009-11-29T23:15:42","date_gmt":"2009-11-29T23:15:42","guid":{"rendered":"http:\/\/www.crazygaze.com\/blog\/2009\/11\/29\/plans-for-the-next-version-of-czplayer\/"},"modified":"2009-11-29T23:22:53","modified_gmt":"2009-11-29T23:22:53","slug":"plans-for-the-next-version-of-czplayer","status":"publish","type":"post","link":"https:\/\/www.crazygaze.com\/blog\/2009\/11\/29\/plans-for-the-next-version-of-czplayer\/","title":{"rendered":"Plans for the next version of czPlayer"},"content":{"rendered":"<div>Been in Scotland for near 2 years already, working at RealtimeWorlds, more specifically in a game called <strong>APB<\/strong>.<\/div>\n<div>Times does fly when we&#8217;re having fun!<\/div>\n<div>Meanwhile, I did work a bit in czPlayer, but nothing really new. Mostly bugfixes or small features for a client.<\/div>\n<div>So despite not having any updates here in the blog, the following things happened to czPlayer<\/div>\n<div>&#8211; Some games using czPlayer were release<\/div>\n<div>&#8211; A client added iPhone support. Was as simple as creating a single class with about 160 lines of code.<\/div>\n<div>&#8211; Implemented volume ramping, which helps a great deal in removing clicks, especially for chiptunes<\/div>\n<div>&#8211; Added some other small features, again with minor effort. \ud83d\ude42<\/div>\n<div>&#8211; Fixed some bugs, especially related to Symbian.<\/div>\n<div>Also, apart from czPlayer, I managed to squeeze in some other small freelance work.<\/div>\n<div>The last few months I&#8217;ve been thinking where to go next with czPlayer, and I&#8217;ve decided to go with a new design.<\/div>\n<div>Personally, I think the current design is really good performance-wise, minimizing copying memory around unnecessary or other unnecessary overhead.<\/div>\n<div>For example, internally a <em>Mixer<\/em> object contains <em>MixerInputGroup<\/em> objects, and each <em>MixerInputGroup<\/em> contains individual <em>MixerInput <\/em>objects. Each of those classes have a <em>SetVolume<\/em> method, which allows me to have several levels of volume (aka as Global volume and channel volume) which get multiplied to calculate a final volume to apply in a single mixing pass, avoiding the need to mix at the <em>MixerInputGroup<\/em> level, and then again at the <em>Mixer<\/em> level.<\/div>\n<div>Although the current design has proven successful, it does have severe limitations in flexibility, has for example not being able to apply an <span style=\"color: #000000;\">hypothetically<\/span> effect to a single sound or sound group. It&#8217;s only possible to apply an effect to the final mix.<\/div>\n<div>So I decided to go with a new design which should be more flexible, but I&#8217;ll still use the old codebase as reference, especially because of the small fixes\/features I&#8217;ve implemented meanwhile.<\/div>\n<div>Some of the new features I&#8217;m planning:<\/div>\n<div>&#8211; DSP plugins. Will probably provide just 1 or two as an example.<\/div>\n<div>&#8211; Configurable DSP network. This will make it possible to create a custom DSP network and play sounds in specific point in the network.<\/div>\n<div>&#8211; Streaming support. Only Ogg Vorgis planned so far, but should pave the way for other formats<\/div>\n<div>&#8211; Maybe virtual voices (ala FMOD style), if I get the time.<\/div>\n<div><\/div>\n<div>Again, those features shouldn&#8217;t add significant overhead until used, of course.<\/div>\n<div><\/div>\n<div>If the user \u00a0sticks with the default settings, performance should hopefully be comparable to the current version.<\/div>\n<div>I&#8217;ll be dropping support for old Symbian editions (&lt; 3rd edition), which should make some things easier.<\/div>\n<div>I wish I could drop Palm OS, which is a real pain to develop for, but a particular client still requires it.<\/div>\n<div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Been in Scotland for near 2 years already, working at RealtimeWorlds, more specifically in a game called APB. Times does fly when we&#8217;re having fun! Meanwhile, I did work a bit in czPlayer, but nothing really new. Mostly bugfixes or small features for a client. So despite not having any updates here in the blog, [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false,"spay_email":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true},"categories":[3],"tags":[11,9],"jetpack_featured_media_url":"","jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p7jpe0-M","_links":{"self":[{"href":"https:\/\/www.crazygaze.com\/blog\/wp-json\/wp\/v2\/posts\/48"}],"collection":[{"href":"https:\/\/www.crazygaze.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.crazygaze.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.crazygaze.com\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.crazygaze.com\/blog\/wp-json\/wp\/v2\/comments?post=48"}],"version-history":[{"count":0,"href":"https:\/\/www.crazygaze.com\/blog\/wp-json\/wp\/v2\/posts\/48\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.crazygaze.com\/blog\/wp-json\/wp\/v2\/media?parent=48"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.crazygaze.com\/blog\/wp-json\/wp\/v2\/categories?post=48"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.crazygaze.com\/blog\/wp-json\/wp\/v2\/tags?post=48"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}