FMOD scheint Befehlte zu ignorieren..



  • Hi,

    ich versuche vergeblich einen Stream an einen Androiden zu senden - der kommt aber nur zerhack dort an.

    Problem 1:
    Laut Doku durchsucht die FMOD API die MP3 erst nach ID3 Tags. Desswegen wird meine Callback-Funktion PCMRead() ein par Mal aufgerufen bevor die MP3 durch system->playSound(FMOD_CHANNEL_FREE, sound, 0, &channel) abgespielt wird. Das möchte ich mit 'FMOD_IGNORETAGS' (siehe Code) verhindern, was nicht funktioniert (Vor dem Abspielen wird immernoch PCMRead() ausgeführt).

    Problem 2:
    Ich will den Puffer 'unsigned int datalen' der Callbackfunktion PCMRead() ändern, was mit system->setStreamBufferSize(12345, FMOD_TIMEUNIT_RAWBYTES); klappen sollte (oder bin ich falsch informiert?). Wenn ich anschließend getStreamBufferSize() die Puffergröße ausgeben lasse hat er meinen Wert übernommen, innerhalb von PCMRead() sind aber immernoch die Werksseitigen 'unsigned int datalen = 16384'??

    Hier mein Code:

    FMOD::System	*system;
    FMOD::Sound		*sound;
    FMOD::Channel	*channel;
    
    void CMainFrame::Init()
    {
        FMOD_RESULT	result;
        UINT		version;
    
        result = FMOD::System_Create(&system);
        if(result != FMOD_OK)
    		return;
    
        result = system->getVersion(&version);
        if(result != FMOD_OK)
    		return;
    
        if (version < FMOD_VERSION)
    		return;
    
        result = system->init(1, FMOD_INIT_NORMAL, 0);
        if(result != FMOD_OK)
    		return;
    }
    
    FMOD_RESULT CAudioStream::PlaybackStart()
    {
        FMOD_RESULT	result;
    
    	channel = 0;
    	decodesound_lengthbytes = 0;
    
        InitializeCriticalSection(&decodecrit);
    
        result = system->createStream("C:\\Test.mp3", FMOD_OPENONLY | FMOD_LOOP_NORMAL | FMOD_LOWMEM | FMOD_CREATESTREAM | FMOD_IGNORETAGS, 0, &decodesound); 
        if(result != FMOD_OK)
    		return (result);
    
        result = decodesound->getLength(&decodesound_lengthbytes, FMOD_TIMEUNIT_PCMBYTES);
        if(result != FMOD_OK)
    		return (result);
    
        result = decodesound->getDefaults(&decodesound_rate, 0, 0, 0);
        if(result != FMOD_OK)
    		return (result);
    
        memset(&createsoundexinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO));
    
        createsoundexinfo.cbsize            = sizeof(FMOD_CREATESOUNDEXINFO);
        createsoundexinfo.decodebuffersize  = 44100;
        createsoundexinfo.numchannels       = 2;
        createsoundexinfo.length            = decodesound_lengthbytes;
        createsoundexinfo.defaultfrequency  = (int) decodesound_rate;
        createsoundexinfo.format            = FMOD_SOUND_FORMAT_PCM16;
        createsoundexinfo.pcmreadcallback   = PCMRead;
        createsoundexinfo.pcmsetposcallback = PCMSetPosition;
    
        result = system->createStream(0, FMOD_2D | FMOD_OPENUSER | FMOD_LOOP_NORMAL, &createsoundexinfo, &sound);
        if(result != FMOD_OK)
    		return (result);
    
        result = system->playSound(FMOD_CHANNEL_FREE, sound, 0, &channel);
    
    	return (result);
    }
    
    FMOD_RESULT F_CALLBACK PCMRead(FMOD_SOUND *sound, void *data, unsigned int datalen)
    {
        // PCM Daten auslesen...
    }
    


  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten