PS2 OPL SND TEST

Status
Not open for further replies.
I think it is good to initialize that array with the defaults, regardless of what the user really wants to use. Unless you intend no sound to be played when a sound effect cannot be loaded, what if some (but not all) files cannot be loaded?
Ah, that's a good point..Also people wont have to replace every file if they only want to change 'confirm' for example.
I'm still at work but I'll have a better think about it at home.
With your new code there is an error I'm not 100% sure about how to fix
Code:
sfxData->buffer = NULL
After freeing the buffer, I had a couple ideas but they may not either work as intended or may not be efficient. First idea was
Code:
sfx->buffer = NULL
But that may not work as intended. Other is having another loop to confirm the freed buffer along the lines of
Code:
for (i = 0; i < NUM_SFX_FILES; i++)
sfx_files[i].buffer = NULL
But this may not be efficient?
 
Last edited:
ok, this is what i've got so far. default sfx play when AudioPath is '<not set>' {0} in settings menu. external sfx play when AudioPath set in settings menu. defaults always load regardless...can replace some or all sfx the ones that are not replaced on set device are filled in by the defaults.
Code:
#include "include/sound.h"

extern unsigned char scrollV_adp[];
extern unsigned int size_scrollV_adp;

extern unsigned char scrollH_adp[];
extern unsigned int size_scrollH_adp;

extern unsigned char page_adp[];
extern unsigned int size_page_adp;

extern unsigned char cancel_adp[];
extern unsigned int size_cancel_adp;

extern unsigned char transition_adp[];
extern unsigned int size_transition_adp;

extern unsigned char alert_adp[];
extern unsigned int size_alert_adp;

extern unsigned char confirm_adp[];
extern unsigned int size_confirm_adp;

struct sfxEffect {
    const char *name;
    void *buffer;
    int size;
};

static struct sfxEffect sfx_files[NUM_SFX_FILES] = {
    {"scrollV.adp"},      //0 done
    {"scrollH.adp"},      //1 done
    {"page.adp"},         //2 half done L1 R1 (still plays sound if no movement)
    {"cancel.adp"},       //3
    {"transition.adp"},   //4
    {"alert.adp"},        //5 done
    {"confirm.adp"},      //6 done
};

struct audsrv_adpcm_t sfx[NUM_SFX_FILES]; //changed from static so i can declare in other source files for audsrv_adpcm_play()..could possibly achieve same thing with a sfxPlay function..will look into this later.

//Returns 0 if the specified file was read. The sfxEffect structure will not be updated unless the file is successfully read.
static int sfxRead(const char *snd_path, struct sfxEffect *sfx)
{
    FILE* adpcm;
    void *buffer;
    int ret, size;

    adpcm = fopen(snd_path, "rb");
    if (adpcm == NULL)
    {
        printf("failed to open adpcm file %s\n", snd_path);
        return -ENOENT;
    }

    fseek(adpcm, 0, SEEK_END);
    size = ftell(adpcm);
    rewind(adpcm);

    buffer = memalign(64, size);
    if (buffer == NULL)
    {
        printf("Failed to allocate memory for SFX\n");
        fclose(adpcm);
        return -ENOMEM;
    }

    ret = fread(buffer, 1, size, adpcm);
    fclose(adpcm);

    if(ret != size)
    {
        printf("Failed to read SFX: %d (expected %d)\n", ret, size);
        free(buffer);
        return -EIO;
    }

    sfx->buffer = buffer;
    sfx->size = size;

    return 0;
}

static void sfxInitDefaults(void)
{
    sfx_files[0].buffer = scrollV_adp;
    sfx_files[0].size = size_scrollV_adp;
    sfx_files[1].buffer = scrollH_adp;
    sfx_files[1].size = size_scrollH_adp;
    sfx_files[2].buffer = page_adp;
    sfx_files[2].size = size_page_adp;
    sfx_files[3].buffer = cancel_adp;
    sfx_files[3].size = size_cancel_adp;
    sfx_files[4].buffer = transition_adp;
    sfx_files[4].size = size_transition_adp;
    sfx_files[5].buffer = alert_adp;
    sfx_files[5].size = size_alert_adp;
    sfx_files[6].buffer = confirm_adp;
    sfx_files[6].size = size_confirm_adp;
}

//Returns 0 (AUDSRV_ERR_NOERROR) if the sound was loaded successfully.
static int sfxLoad(const struct sfxEffect *sfxData, audsrv_adpcm_t *sfx)
{
    int ret;

    ret = audsrv_load_adpcm(sfx, sfxData->buffer, sfxData->size);
    free(sfxData->buffer);
    sfxData->buffer = NULL; //Mark the buffer as freed. warning: assignment of read-only member `buffer'

    return ret;
}

static void getAudioDevice(char *device_path)
{    
    if ((gAudioPath == 1))
       sprintf(device_path, "mc0:Sound/");
    if ((gAudioPath == 2))
       sprintf(device_path, "mc1:Sound/");
    if ((gAudioPath == 3))
       sprintf(device_path, "pfs0:Sound/");
    if ((gAudioPath == 4))
       sprintf(device_path, "mass0:Sound/");
}

//Returns number of audio files successfully loaded, < 0 if an unrecoverable error occurred.
int sfxInit(void)
{
    char path[256];
    char *snd_path = path;
    char device_path[128];
    int ret, i, loaded;

    ret = audsrv_init();
    if (ret != 0)
    {
        printf("sfx: failed to initialize audsrv\n");
        printf("audsrv returned error string: %s\n", audsrv_get_error_string());
        return -1;
    }

    audsrv_adpcm_init();
    audsrv_set_volume(MAX_VOLUME);

    sfxInitDefaults();
    getAudioDevice(device_path);

    loaded = 0;
    for (i = 0; i < NUM_SFX_FILES; i++)
    {
        if ((gAudioPath > 0))
        {
           sprintf(snd_path, "%s/%s", device_path, sfx_files[i].name);
        }
        else
        {
           snd_path = (char *)sfx_files[i].buffer;
        }

        ret = sfxRead(snd_path, &sfx_files[i]);
        if (ret != 0)
        {
           printf("sfx: %s could not be loaded. Using default sound %d.\n", snd_path, ret);
        }

        ret = sfxLoad(&sfx_files[i], &sfx[i]);
        if (ret == 0)
        {
            loaded++;
        }
        else
        {
           printf("sfx: failed to load %s, error %d\n", snd_path, ret);
        }
    }

    return loaded;
}
I get a compile error in sfxLoad() still trying to figure out a solution, hopefully this looks reasonable. I've tested it seems to work as intended.
 
With your new code there is an error I'm not 100% sure about how to fix
Code:
sfxData->buffer = NULL
Code:
    sfxData->buffer = NULL; //Mark the buffer as freed. warning: assignment of read-only member `buffer'

To fix that warning, simply change the function's declaration to:
Code:
//Returns 0 (AUDSRV_ERR_NOERROR) if the sound was loaded successfully.
static int sfxLoad(struct sfxEffect *sfxData, audsrv_adpcm_t *sfx)

(Remove the const modifier)

After freeing the buffer, I had a couple ideas but they may not either work as intended or may not be efficient. First idea was
Code:
sfx->buffer = NULL
But that may not work as intended. Other is having another loop to confirm the freed buffer along the lines of
Code:
for (i = 0; i < NUM_SFX_FILES; i++)
sfx_files[i].buffer = NULL
But this may not be efficient?
It's not about confirming that the buffer was freed, but to mark that the buffer was freed. So if you ever get a NULL-pointer exception, you can tell that the code was reusing a buffer that was already freed. Rather than letting the code use a pointer that is no longer valid for its purpose (which is a dangling pointer).
When in doubt, this is perhaps a good thing to do.
 
If the next commit is working (and has those minimal sounds implemented, excluding i.e. BGM), it's worth a new 'Test-build' for the masses, or not? ;)
 
These aren't the best sfx but they can be changed later, I just needed to quickly grab some royalty free ones (thanks to @sandungas for links) so I could prove their source.

I included a folder called 'convert' it has the adpcm encoder from the ps2sdk and a quick simple bat to convert your wav files to adp: put your wav files (renamed to scrollV.wav etc) in that folder and run the bat to convert if you want to try your own sfx.

Royalty free sfx are from here
Code:
http://www.flashkit.com/soundfx/Interfaces/Clicks/Click_16-Partners-44/index.php           //scrollH

http://www.flashkit.com/soundfx/Interfaces/Switches/Switch19-intermed-5228/index.php      //cancel

http://www.flashkit.com/soundfx/Interfaces/Switches/Switch19-intermed-5235/index.php     //confirm

http://www.flashkit.com/soundfx/Interfaces/Zips/idg-zip2-intermed-2884/index.php         //page

http://www.flashkit.com/soundfx/Interfaces/Zips/idg-zip3-intermed-2896/index.php        //transition

http://www.flashkit.com/soundfx/Electronic/Alarms/alarma-DESIGNSQ-7820/index.php       //alert

http://www.flashkit.com/soundfx/Interfaces/Clicks/ambient_-agent_vi-8701/index.php     //scrollV

If you wish to use your own sfx you will need to restart OPL after setting the Audio Device and saving the config.

External sound paths are as follows:
Code:
mc0:SND
mc1:SND
pfs0:+OPL/SND
mass0:SND
I changed the folder name from 'Sound' to 'SND' to better match existing OPL folders; 'THM' 'CFG' etc.

5 sfx files are currently in use, need to set more calls to audsrv_play_adpcm()
All feedback/suggestions welcome.

HUGE thanks to @sp193 for helping it get this far by providing a lot of the code that makes this run.
 

Attachments

These aren't the best sfx but they can be changed later, I just needed to quickly grab some royalty free ones (thanks to @sandungas for links) so I could prove their source.
That's fine IMO, as long as they are 'free'. :)

I included a folder called 'convert' it has the adpcm encoder from the ps2sdk and a quick simple bat to convert your wav files to adp: put your wav files (renamed to scrollV.wav etc) in that folder and run the bat to convert if you want to try your own sfx.

Royalty free sfx are from here
Code:
http://www.flashkit.com/soundfx/Interfaces/Clicks/Click_16-Partners-44/index.php           //scrollH

http://www.flashkit.com/soundfx/Interfaces/Switches/Switch19-intermed-5228/index.php      //cancel

http://www.flashkit.com/soundfx/Interfaces/Switches/Switch19-intermed-5235/index.php     //confirm

http://www.flashkit.com/soundfx/Interfaces/Zips/idg-zip2-intermed-2884/index.php         //page

http://www.flashkit.com/soundfx/Interfaces/Zips/idg-zip3-intermed-2896/index.php        //transition

http://www.flashkit.com/soundfx/Electronic/Alarms/alarma-DESIGNSQ-7820/index.php       //alert

http://www.flashkit.com/soundfx/Interfaces/Clicks/ambient_-agent_vi-8701/index.php     //scrollV
It's from the open/Homebrew-PS2SDK, right (Edit: I mean the encoder.)?

If you wish to use your own sfx you will need to restart OPL after setting the Audio Device and saving the config.
It should be possible, to make it instantly use the new sounds (i.e. via a config-reinit or a similar approach like the VMode-change, etc.), even tho' it is not a problem if OPL needs a restart. ;)

External sound paths are as follows:
Code:
mc0:SND
mc1:SND
pfs0:+OPL/SND
mass0:SND
I changed the folder name from 'Sound' to 'SND' to better match existing OPL folders; 'THM' 'CFG' etc.
Lol! I wanted to suggest you the very same thing (SND or SFX), for the very same reason... and it used upper- and lower-case-characters before...

5 sfx files are currently in use, need to set more calls to audsrv_play_adpcm()
All feedback/suggestions welcome.
I would be interested, if we can use 24 or 48 voice-channels without issues.

Suggestions (feature-wise, not directly related to the sound-implementation, but rather the configuration-backend):
  • a way to directly use the custom SFX, without a restart
  • an implementation, which lets themes override the SFXs and use files from another path (i.e. '%THEMEFOLDER%/SND', or even configurable via theme-config)... This essentially would enable us to use 'sounds per theme', which would be a great experience for users and theme-creators alike, IMO! :)
HUGE thanks to @sp193 for helping it get this far by providing a lot of the code that makes this run.
Indeed!:triumphant:
 
Last edited:
Trying to quote on my phone is terrible can only select a word :p but
Hmmm... Quotations work well for me via Chrome on Android. ;)

Yes it's from the ps2dev SDK.
Alright!

It's due to when the files & paths are read and stored in the buffer. It all happens at init() but perhaps it could reinit at some point like you suggested, I'll look into it.

Either that, or the part that handles this could be excluded into a separate task/sub-routine, which then could be called during runtime.

Either way, it would be necessary if it is ever meant to be supported via themes as well (because changing themes during runtime would not work, if they support sounds... atleast the new sounds wouldn't work after changing a theme...).

I really hope for both implementations[/'ideas to be implemented'] (see suggestions above)! :)
 
'Test 5' works quite good, IMO!

The OSD-Keyboard (marking a new letter) currently lacks a sound. ;)

Is the sound and the config initialized and read, before the OPL-Logo is shown (I think it is...)? It would be interesting, if we could play a (theme-dependent) 'startup-sound', during the OPL-Logo!


So...Here are 'a few' suggestions collected in a list (lol):
  • Stream-loading/Streaming of files bigger than... (i.e. 0.5MB)
  • Sound-path-handling either excluded to a separate sub-routine, which can be called during runtime or a re-init, to support changing of sounds/paths during runtime
  • Global and separate Voice-channel-volume-handling, where '100' is the full volume and '0' would prevent a sound entirely from being loaded into SRAM (so '0' essentially should not just mute the sound-file, but really disable it.)... So either a separate Number-Block, or a 'bar' to handle these... (per sound-file!)
  • Startup- and OSD-Keyboard-Sounds
  • Theme-configurable sounds/SFX
  • etc.
 
Last edited:
OMG... @RivalK93 just had a gorgeous while obvious idea!

Game-specific sounds (which are played while the game is marked!)!

So, if these things are implemented:
  • streaming of files bigger than (i.e. 0.5MB)
  • playing of files with another name (game-ID-specific) [connected to the variable paths]
  • etc.
...those Game(-ID)-Specific sounds could be added and would create a whole new 'GUI-Experience'!
 
@TnA
got another dirty test if you get a chance and want to check it out for me.

Added some play calls for the OSD Keyboard (i think most should work as intended).
Start up sound may be tricky as the logo is displayed during a while loop.

I separated sfxInit and the reading/loading part of the function into a sfxPrep func so that prep can be called to clear the buffer and repopulate sound paths etc after leaving the audio settings menu, is this the best way to do it? NO lol i know its not, it would be better to call sfxPrep in the applyconfig function with something like an if 'changed' parameter but the getAudioDevice function would need to rewritten to be...well...better.
For now I just want to see what happens, 1 of 2 things I believe:

It will work as intended for now and repop the sounds after leaving the audio settings menu
or
It will freeze after leaving the menu due to calling audsrv_adpcm_init() again which is an rpc func that i had issues calling multiple times in earlier tests but im hoping is now fixed due to sp193s code

In regards to the 'missing sounds' if you let me know which ones are missing sounds like you did with the keyboard it'll make it easier for me to try find the existing code in OPL where the sound call(s) should go.

I still dont have access to a ps2 which is a bit frustrating to test things quickly, if you dont get a chance to test its totally fine :)
 

Attachments

  • Like
Reactions: TnA
@TnA
got another dirty test if you get a chance and want to check it out for me.
Alright! Partial success! :)
It starts properly and plays the sounds! If I enter the sound-options and press o.k. (I didn't changed anything.), it freezes! ;)

Added some play calls for the OSD Keyboard (i think most should work as intended).
Yes, it seems to work as Intended! Keyboard-Sounds ('change letter' and 'enter letter') seem to work.

The options-submenu seem to be lacking sounds (or are they not intended there?)! The sameiis true for the game-settings-submenu! ;)

Start up sound may be tricky as the logo is displayed during a while loop.

Yes, I think so... (it being rather tricky to implement)
Well, it is not a priority tho', but it would be cool, especially as a linked theme-feature!

I separated sfxInit and the reading/loading part of the function into a sfxPrep func so that prep can be called to clear the buffer and repopulate sound paths etc after leaving the audio settings menu, is this the best way to do it? NO lol i know its not, it would be better to call sfxPrep in the applyconfig function with something like an if 'changed' parameter but the getAudioDevice function would need to rewritten to be...well...better.
For now I just want to see what happens, 1 of 2 things I believe:

It will work as intended for now and repop the sounds after leaving the audio settings menu
or
It will freeze after leaving the menu due to calling audsrv_adpcm_init() again which is an rpc func that i had issues calling multiple times in earlier tests but im hoping is now fixed due to sp193s code

Well... The re-init causes a freeze... However... If you were also using that sub-function during the first init of OPL (when it starts), then this function itself seems to be properly excluded from the init-thread. :)

In regards to the 'missing sounds' if you let me know which ones are missing sounds like you did with the keyboard it'll make it easier for me to try find the existing code in OPL where the sound call(s) should go.

I still dont have access to a ps2 which is a bit frustrating to test things quickly, if you dont get a chance to test its totally fine :)

Well, beside the freezing in the Sound-settings, all your changes seem to work properly!
OPL starts, the sounds are working and solely the Sound-settings freeze, once I want to 'o.k. Out'...

Regarding missing sounds: Within the sub-menus (various options/settings and the compatibility-submenu, etc.)!
 
Thanks a lot for testing that for me :)

Well... The re-init causes a freeze... However... If you were also using that sub-function during the first init of OPL (when it starts), then this function itself seems to be properly excluded from the init-thread.
Gah, yea the problem is calling audsrv_adpcm_init() or any other (audsrv) rpc functions after the inital boot up...perhaps i need to call SifInitRpc() again before the rpc func call.

Regarding missing sounds: Within the sub-menus (various options/settings and the compatibility-submenu, etc.)!
Thanks, I think? diaExecuteDialog() handles these sub menus..I'll test some calls in there.
 
  • Like
Reactions: TnA
Thanks a lot for testing that for me :)

Sure, no problem!

Gah, yea the problem is calling audsrv_adpcm_init() or any other (audsrv) rpc functions after the inital boot up...perhaps i need to call SifInitRpc() again before the rpc func call.

Either that, or a forceful re-init of the whole library (including unloading and reloading) might be needed... and that in turn would need some 'closing-actions' on the backend-side, to prevent 'dangling pointers' and possible memory-leaks... Not really a preferable solution, tho'... :-|

Thanks, I think? diaExecuteDialog() handles these sub menus..I'll test some calls in there.

Wasn't that for the text on the bottom? I can't remember...
 
Gah, yea the problem is calling audsrv_adpcm_init() or any other (audsrv) rpc functions after the inital boot up...

Can you show your code? You're using RPC functions, which includes audsrv_adpcm_play().

perhaps i need to call SifInitRpc() again before the rpc func call.

Please don't do that. It should only be necessary once, after either starting the program or after the IOP is reboot. In this case, OPL's initialization code should take care of this..
 
@sp193
Thanks I didn't think calling sifinitrpc() again would be a good idea which is why I didn't try it earlier but I wasn't 100% sure.

Sfxprep is basically just the same as init was but with audsrv_init() taken out and made its own function so prep can be called to just call audsrv_adpcm_init() to clear the buffer and then it continues on as normal reading sound paths etc..They are both still used at OPL init but this way I can call prep separately later to repopulate sound in case devices are changed.

I put the prep call in the audio settings menu after applyconfig () temporarily to see if it would repopulate after leaving the menu.

It seems that I can't call audsrv_adpcm_init() more than one time which is at init() now and I can't call audsrv_quit() at all but maybe I'm just trying to call them at the wrong time like I was with sfxinit()

I'll post the code when I get home if this is too annoying to try follow what I mean ;)
 
  • Like
Reactions: TnA
Just a little list, of the features which depend on a variable path (also a possible implementation in the future would be dependent on it) which can be changed during runtime:
  • Per game sounds (path would change for every marked game)
  • Per theme sounds (atleast, if changing a theme should work without a restart)
  • Sound/device-changes (if it should work without a restart)
  • etc.

Btw.: A little suggestion... If 'per game sounds' ever gets implemented, I suggest splitting off the game-sounds to the SND-Folder or put it in the ART-Folder [essentially making it a resource/RES-Folder] (and the sound should have the game-ID in the beginning, just like the ART) and the GUI-Sounds could be in an SFX-Folder (only needed, when the Per-game-sounds are not in the ART/RES-Folder).
Well, that's a proposal for the future, so not so important as of now.
 
@sp193

sound.c
Code:
int sfxPrep(void)

{
    char path[256];
    char *snd_path = path;
    char device_path[128];
    int ret, i, loaded;

    audsrv_adpcm_init();
    audsrv_set_volume(MAX_VOLUME);

    sfxInitDefaults();
    setAudioDevice(device_path);

    loaded = 0;
    for (i = 0; i < NUM_SFX_FILES; i++)
    {
        if ((gAudioPath > 0))    //still not sure these few lines are the best way to handle this, it does appear to work though
        {
           sprintf(snd_path, "%s/%s", device_path, sfx_files[i].name);
        }
        else
        {
           snd_path = (char *)sfx_files[i].buffer;
        }

        ret = sfxRead(snd_path, &sfx_files[i]);
        if (ret != 0)
        {
           printf("sfx: %s could not be loaded. Using default sound %d.\n", snd_path, ret);
        }

        ret = sfxLoad(&sfx_files[i], &sfx[i]);
        if (ret == 0)
        {
            loaded++;
        }
        else
        {
           printf("sfx: failed to load %s, error %d\n", snd_path, ret);
        }
    }

    return loaded;
}

int sfxInit(void)
{
    int ret;
    ret = audsrv_init();
    if (ret != 0)
    {
        printf("sfx: failed to initialize audsrv\n");
        printf("audsrv returned error string: %s\n", audsrv_get_error_string());
        return -1;
    }

    sfxPrep();

    return ret;
}

gui.c
Code:
void guiShowAudioConfig(void)
{
    const char *AudioPaths[] = {"<not set>", "MC 1", "MC 2", "HDD", "USB", NULL};
    diaSetEnum(diaAudioConfig, CFG_AUDIOPATH, AudioPaths);
    diaSetInt(diaAudioConfig, CFG_SFX, gEnableSFX);
    diaSetInt(diaAudioConfig, CFG_AUDIOPATH, gAudioPath);

    int ret = diaExecuteDialog(diaAudioConfig, -1, 1, &guiUpdater);
    if (ret) {
        diaGetInt(diaAudioConfig, CFG_SFX, &gEnableSFX);
        diaGetInt(diaAudioConfig, CFG_AUDIOPATH, &gAudioPath);
        applyConfig(-1, -1);
    sfxPrep();
    }
}

sfxInit() is still the same 'deffered init' during opl init(). basically I was just trying to test calling audsrv_adpcm_init() a second time as previous attempts caused it to lock up. I know this would run the func everytime leaving the menu even if nothing was changed this was just a temporary test.

It seems as though the func (sfxInit/Prep) can only be called during the inital init(), i know previously you did say that is the correct way to handle it I was just trying to see if i could get the paths to reset at some point linked to cfg without adding sounds as theme elements, cause that just seems like too much work for me. I'm not against the idea but i think its better to just get the basics down and if someone more skilled wants to come along and add more customization in the future, so be it
 
Last edited:
Did you actually establish that it was getting stuck during the call to audsrv_adpcm_init(), or did it just seem that way?

Code:
        if ((gAudioPath > 0))    //still not sure these few lines are the best way to handle this, it does appear to work though

It is okay to check this variable, to determine whether an external audio file is specified, however....

Code:
        {
           sprintf(snd_path, "%s/%s", device_path, sfx_files[i].name);
        }
        else
        {
           snd_path = (char *)sfx_files[i].buffer;
        }

snd_path is a pointer to a string, so you should not get it to point to a buffer containing the sound data. If you are getting a compile-time warning about type mismatches, you should try to understand why you are getting them, rather than just adding a cast.

Depending on the bytes within sfx_files[].buffer, it could cause a fault within this function call:
Code:
        ret = sfxRead(snd_path, &sfx_files[i]);

Instead, you can just choose to not call sfxRead() entirely, if no file is provided. sfxRead() is meant to read in an ADPCM file.

Code:
if (gAudioPath > 0)
{
     sprintf(snd_path, "%s/%s", device_path, sfx_files[i].name);
     ret = sfxRead(snd_path, &sfx_files[i]);
     if (ret != 0)
     {
          printf("sfx: %s could not be loaded. Using default sound %d.\n", snd_path, ret);
     }
}
 
Instead, you can just choose to not call sfxRead() entirely, if no file is provided. sfxRead() is meant to read in an ADPCM file.
Ah that makes sense and i was even doing this previously back on page 1 when I was only using compiled in sounds, for some reason when the code got more complex I couldn't see the answer.. Intimidated I guess heh. Thank you.

Did you actually establish that it was getting stuck during the call to audsrv_adpcm_init(), or did it just seem that way?
It just seems that way due to previous tests, I can change the call in audio settings to just be audsrv_adpcm_init() to try narrow it down further to that function alone but unfortunately I don't have a TOOL and my previous attempts to use ps2link with a debug enabled version of OPL just resulted in black screens.
 
Status
Not open for further replies.

Similar threads

Back
Top