0
0

I’m trying to use libsidplay2 so create a plugin for FMOD to play .sid-files. I’ve looked at the codec_raw-example and the ape-plugin by Danny Dulai. However my sound programmingknowledge could be better… there’s some parameters in FMOD_CODEC_WAVEFORMAT im not sure what to assign.

lengthpcm? "length in seconds * frequency" says the docs… but I don’t know the length of a sid… don’t think it’s possble to get the length.

format? FMOD_SOUND_FORMAT_PCM16 or FMOD_SOUND_FORMAT_PCM8?

blockalign? I have no idea?

I’ve managed to create a dll-file that fmod successfully loads. Playing a .sid-file now opens it and trying to play it which results in 100% cpu-usage (and no sound), can’t find any errors from fmod or libsidplay though.

  • You must to post comments
0
0

I don’t quite understand what you mean… for example how do I know where fmod read the file into (and how big the file was)? And I don’t uderstand how I should use the read callback in the plugin to read the file… because that just read the sampledata the sidplayer produces… here’s the code, could you give some more hints?

[code:3tpsexrh]FMOD_RESULT F_CALLBACK sidopen(FMOD_CODEC_STATE *codec, FMOD_MODE usermode, FMOD_CREATESOUNDEXINFO *userexinfo);
FMOD_RESULT F_CALLBACK sidclose(FMOD_CODEC_STATE *codec);
FMOD_RESULT F_CALLBACK sidread(FMOD_CODEC_STATE *codec, void *buffer, unsigned int size, unsigned int *read);
FMOD_RESULT F_CALLBACK sidsetposition(FMOD_CODEC_STATE *codec, int subsound, unsigned int position, FMOD_TIMEUNIT postype);

FMOD_CODEC_DESCRIPTION sidcodec =
{
"FMOD Sid player plugin", // Name.
0x00010000, // Version 0xAAAABBBB A = major, B = minor.
0, // Don’t force everything using this codec to be a stream
FMOD_TIMEUNIT_PCMBYTES, // The time format we would like to accept into setposition/getposition.
&sidopen, // Open callback.
&sidclose, // Close callback.
&sidread, // Read callback.
0, // Getlength callback. (If not specified FMOD return the length in FMOD_TIMEUNIT_PCM, FMOD_TIMEUNIT_MS or FMOD_TIMEUNIT_PCMBYTES units based on the lengthpcm member of the FMOD_CODEC structure).
&sidsetposition, // Setposition callback.
0, // Getposition callback. (only used for timeunit types that are not FMOD_TIMEUNIT_PCM, FMOD_TIMEUNIT_MS and FMOD_TIMEUNIT_PCMBYTES).
0 // Sound create callback (don’t need it)
};
class macio : public sidplay2
{
FMOD_CODEC_STATE *_codec;
int _pos;

public:
    macio(FMOD_CODEC_STATE *codec)
    {
        _codec = codec;
        _pos = 0;
        LogFile = new CLogFile("sid.log");
        tune = NULL;

        memset(&sidwaveformat, 0, sizeof(sidwaveformat));
    }

    ~macio()
    {
        delete tune;
    }
    SidTune *tune;
    FMOD_CODEC_WAVEFORMAT sidwaveformat;

};

/*
FMODGetCodecDescription is mandatory for every fmod plugin. This is the symbol the registerplugin function searches for.
Must be declared with F_API to make it export as stdcall.
MUST BE EXTERN’ED AS C! C++ functions will be mangled incorrectly and not load in fmod.
*/

ifdef __cplusplus

extern "C" {

endif

F_DECLSPEC F_DLLEXPORT FMOD_CODEC_DESCRIPTION * F_API FMODGetCodecDescription()
{
return &sidcodec;
}

ifdef __cplusplus

}

endif

static FMOD_CODEC_WAVEFORMAT sidwaveformat;

FMOD_RESULT F_CALLBACK sidopen(FMOD_CODEC_STATE *codec, FMOD_MODE usermode, FMOD_CREATESOUNDEXINFO *userexinfo)
{

macio *m = new macio(codec);

m->tune = new SidTune("c:\\sid\\1.sid");



m->tune->selectSong(0);
m->load(m->tune);

m->sidwaveformat.channels     = 2;
m->sidwaveformat.format       = FMOD_SOUND_FORMAT_PCM16;
m->sidwaveformat.frequency    = 44100;
m->sidwaveformat.blockalign   = (16 >> 3) * m->sidwaveformat.channels;
m->sidwaveformat.lengthpcm    = 0xffffffff; //inifite length

codec->waveformat   = &(m->sidwaveformat);
codec->numsubsounds = s.songs;
codec->plugindata   = m;                    //user data value


return FMOD_OK;

}

FMOD_RESULT F_CALLBACK sidclose(FMOD_CODEC_STATE codec)
{
delete (macio
)codec->plugindata;

return FMOD_OK;

}

FMOD_RESULT F_CALLBACK sidread(FMOD_CODEC_STATE codec, void *buffer, unsigned int size, unsigned int *read)
{
macio *m = (macio
)codec->plugindata;
read = m->play((signed short)buffer,codec->waveformat->blockalign*sizeof(signed short));
return FMOD_OK;
}

FMOD_RESULT F_CALLBACK sidsetposition(FMOD_CODEC_STATE *codec, int subsound, unsigned int position, FMOD_TIMEUNIT postype)
{
//seeking can’t be done, so just return ok
return FMOD_OK;
}
[/code:3tpsexrh]

  • You must to post comments
0
0

so is it 8 bits for sid?

However the same problem persists…

I call
[code:1awybwp6]createSound(name.c_str(), FMOD_CREATESTREAM , 0, &sound1);[/code:1awybwp6]
but this call never returns, first the Open callback in the plugin is called, then the Setposition and then it loops in the Read callback. Even if I have a
[code:1awybwp6]return FMOD_OK;[/code:1awybwp6]
last in the Read-function createSound never exits (the Read-function isn’t stuck, it loops infinitely).

  • You must to post comments
0
0

[quote="Heffo":35anogak][quote="bLAZER":35anogak]I’ll put it up for download if someone is interested.[/quote:35anogak]

I am interested! :lol:[/quote:35anogak]

I am interested too!

Good work

  • You must to post comments
0
0

I set it to 0xffffffff now,

But as I wrote, if I set both frequencies to 22050 or both to 44100 I get the same stuttering except that the sond plays twice as fast… so there must be something else that’s also is wrong, but I don’t understand what…

  • You must to post comments
0
0

I recompiled this plugin with latest version of FMOD and as far as I know I have’nt changed anything in the code.

I’m using playsound from the examples:

[code:3h7mvg6w]system->createSound("Commando.sid", FMOD_SOFTWARE|FMOD_CREATESTREAM, 0, &sound1);[/code:3h7mvg6w]

I get no errors. The application eats about 1.5gb virtual mem and doesn’t get past that line.

Any ideas? Anything changed in FMOD last 6 months so that the plugin doesn’t work any longer?

  • You must to post comments
0
0

Have you read the sourcecode of sidplay 2 ?
See sid2_config_t struct, here, you set the propertie of the sound to produce and then, according to what you have set, you will have to create appropriate buffer : ie. signed short * for a 16 bits sound, signed char * for a 8 bits sound … (the "signed" keyword can be an option as it is signed by default for the compiler).

Don’t produce the sound for the first callback, create a flag wich tell you to mix or not when fmodex update it’s mixer, sid format is a special case.

  • You must to post comments
0
0

I’m not sure how to tackle the subsongs…

I’ve created an array of FMOD_CODEC_WAVEFORMAT for the number of subsongs. But when a user selects a subsound with getSubSound I need to change subsong in my plugin with:

[code:35fnidqb]
m->tune->selectSong(index);
m->load(m->tune);
[/code:35fnidqb]

I can’t do that for all songs initially since the songs are interpreted at playtime. So I need to now when the getSubSound is called and change subsound then. Is that possible or is there some other way?

  • You must to post comments
0
0

Now I got it working. By mistake in the read callback I returned twice as much as it should. And about the stuttering…. I realised my cpu was 99% while playing, and saw that I hade forgot to comment out writing to my logfile, which it did every block.. ๐Ÿ˜ณ

So now on to the next problem, what is the easiest way to get the filename from FMOD to the plugin?

  • You must to post comments
0
0

verify all the callbacks are correct and that it matches the latest interface, some things may have changed since then.

  • You must to post comments
0
0

length can be PCM of 0xffffffff which tells fmod it is an infinite file.

  • You must to post comments
0
0

Get the plugin here [url:1r13d1cd]http://andreas.blazer.nu/programs.php[/url:1r13d1cd]!!!

I haven’t got subsongs to work yet, but I uploaded the plugin along with the source. If anyone knows how to add support for it please let me know.

  • You must to post comments
0
0

you’re actually supposed to use the filesystem provided with fmod, it has already used the filename to open the file and check it through other codecs to see what type of file it is. It also could be loaded from memory, or an internet file, part of a pak file, or using an overriden filesystem (ie the programmer used System::setFileSystem), so if you want to use your own filesystem that stuff just won’t work (who knows what the end programmer will do).
is it possible to make the sid library read file data though fmod’s file functions? (ie do they provide a file callback system or you could just change the code to point to other file reading functions)

  • You must to post comments
0
0

wow… that’s really strange… I started to check around a bit, tried a couple of things and now it works. However it’s exactly the same code and libs I use as yesterday…. that’s odd… must have been some crap in my memory yesterday or seomthing.

  • You must to post comments
0
0

The master talked, i didn’t notice that value ๐Ÿ˜›

  • You must to post comments
0
0

Sweet! … I’ve been eyeballing this thread while trying to get allegro to play SID files, either with FMOD or allegros basic streaming sound functions.
I got as far(?) as getting allegro to play SIDs with in_sid.dll plugin but it sounded just awful ๐Ÿ˜•

To be honest, I just registered to say, thank you ๐Ÿ˜€
I will give you full credit for the SID support in my IK+ remake for the PC ๐Ÿ˜€

—EDIT—
Hope you get the subsongs part working 8)

  • You must to post comments
0
0

can I read the file from a buffer using this function in libsid
[code:1h80vfqa]bool read(const uint_least8_t* sourceBuffer, const uint_least32_t bufferLen)[/code:1h80vfqa]

can I get hold of the contents that Fmod read from the file/memory/whetever?

  • You must to post comments
0
0

I’m way over my head here… I’m trying to read the whole sid-file into memory. Is this anywhere nea correct? It crashes at the last line.

[code:1ck666p1]
unsigned int* myBuffer;
myBuffer = new unsigned int[codec->filesize];
unsigned int *read=0;
result = codec->fileread(codec,myBuffer,codec->filesize,read,0);
[/code:1ck666p1]

  • You must to post comments
0
0

I think I better get down and write a small test app first to get to understand libsid first. I’ll be back with more questions, don’t worry : ๐Ÿ˜€

  • You must to post comments
0
0

Thank you for your kind words ๐Ÿ˜€

Lemme know how the IK+ development goes :)

  • You must to post comments
0
0

You have a play function in Player.cpp.

  • You must to post comments
Showing 1 - 20 of 43 results
Your Answer

Please first to submit.