fmodex를 사용하려 합니다. 함수의 콜백등록은 어떻게 해야 하나

2권에서 새로 도입된 오디오 프로그래밍 섹션에 대한 게시판입니다.

Moderator: 류광

Locked
비회원

fmodex를 사용하려 합니다. 함수의 콜백등록은 어떻게 해야 하나

Post by 비회원 »

제목 그대로 인데요..

fmodex를 사용해서 사운드를 출력하려 합니다.

fmod의 경우 callback함수를 등록하는함수가 따로 있는거 같은데요..
fmodex의 경우 하나의 함수로 그리고 내부적으론 type으로 분류를 한거 같은데요..

사실 맞는지 잘은 모르겠습니다.-_-;;;

fmodex를 사용하여
파일재생이 끝났다는것을 callback으로 받으려면 어떻게 해야 하나요?

요 문제가 하루죙일 괴롭히네요..

조언부탁드리겠습니다.
비회원

Re: fmodex를 사용하려 합니다. 함수의 콜백등록은 어떻게 해야

Post by 비회원 »

Channel::setCallback 함수를 사용하시면 될 것 같네요
type 은 FMOD_CHANNEL_CALLBACKTYPE_END 로 주면 되겠죠? ^^

비회원 wrote:제목 그대로 인데요..

fmodex를 사용해서 사운드를 출력하려 합니다.

fmod의 경우 callback함수를 등록하는함수가 따로 있는거 같은데요..
fmodex의 경우 하나의 함수로 그리고 내부적으론 type으로 분류를 한거 같은데요..

사실 맞는지 잘은 모르겠습니다.-_-;;;

fmodex를 사용하여
파일재생이 끝났다는것을 callback으로 받으려면 어떻게 해야 하나요?

요 문제가 하루죙일 괴롭히네요..

조언부탁드리겠습니다.
비회원

Re: fmodex를 사용하려 합니다. 함수의 콜백등록은 어떻게 해야

Post by 비회원 »

비회원 wrote:Channel::setCallback 함수를 사용하시면 될 것 같네요
type 은 FMOD_CHANNEL_CALLBACKTYPE_END 로 주면 되겠죠? ^^

비회원 wrote:제목 그대로 인데요..

fmodex를 사용해서 사운드를 출력하려 합니다.

fmod의 경우 callback함수를 등록하는함수가 따로 있는거 같은데요..
fmodex의 경우 하나의 함수로 그리고 내부적으론 type으로 분류를 한거 같은데요..

사실 맞는지 잘은 모르겠습니다.-_-;;;

fmodex를 사용하여
파일재생이 끝났다는것을 callback으로 받으려면 어떻게 해야 하나요?

요 문제가 하루죙일 괴롭히네요..

조언부탁드리겠습니다.
우선 조언감사합니다.

Code: Select all

/*===============================================================================================
 File Callbacks Example
 Copyright (c), Firelight Technologies Pty, Ltd 2004-2005.

 This example is a modified version of the playstream example.
 It shows the correct way declare and handle fmod file callbacks with System::setFileSystem.
===============================================================================================*/
#include "../../api/inc/fmod.hpp"
#include "../../api/inc/fmod_errors.h"
#include <windows>
#include <stdio>
#include <conio>


void ERRCHECK(FMOD_RESULT result)
{
    if (result != FMOD_OK)
    {
        printf("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result));
        exit(-1);
    }
}


/*
    TIPS:

    1. use F_CALLBACK.  Do NOT force cast your own function to fmod's callback type.
    2. return FMOD_ERR_FILE_NOTFOUND in open as required.
    3. return number of bytes read in read callback.  Do not get the size and count 
       around the wrong way in fread for example, this would return 1 instead of the number of bytes read.

    QUESTIONS:

    1. Why does fmod seek to the end and read?  Because it is looking for ID3V1 tags.  
       Use FMOD_IGNORETAGS in System::createSound / System::createStream if you don't like this behaviour.

*/



FMOD_RESULT F_CALLBACK mycallback(FMOD_CHANNEL *channel, FMOD_CHANNEL_CALLBACKTYPE type, int command, unsigned int commanddata1, unsigned int commanddata2)
{

	FMOD::Channel *cppchannel = (FMOD::Channel *)channel;

	printf("mycallback");

	return FMOD_OK;

}

int main(int argc, char *argv[])
{
    FMOD::System     *system;
    FMOD::Sound      *sound;
    FMOD::Channel    *channel = 0;
    FMOD_RESULT       result;
    int               key;
    unsigned int      version;
	
    /*
        Create a System object and initialize.
    */
    result = FMOD::System_Create(&system);
    ERRCHECK(result);

    result = system->getVersion(&version);
    ERRCHECK(result);

    if (version <FMOD_VERSION>init(1, FMOD_INIT_NORMAL, 0);
    ERRCHECK(result);

    result = system->createStream("../media/wave.mp3", FMOD_HARDWARE | FMOD_LOOP_NORMAL | FMOD_2D, 0, &sound);
    ERRCHECK(result);

    printf("========================================================================\n");
    printf("File Callbacks Example.  Copyright (c) Firelight Technologies 2004-2005.\n");
    printf("========================================================================\n");
    printf("\n");
    printf("Press space to pause, Esc to quit\n");
    printf("\n");

    /*
        Play the sound.
    */

    result = system->playSound(FMOD_CHANNEL_FREE, sound, false, &channel);
    ERRCHECK(result);
	
	result = channel->setCallback(FMOD_CHANNEL_CALLBACKTYPE_END, mycallback, 0);
	ERRCHECK(result);

    /*
        Main loop.
    */
    do
    {
        if (kbhit())
        {
            key = getch();

            switch (key)
            {
                case ' ' :
                {
                    bool paused;
                    channel->getPaused(&paused);
                    channel->setPaused(!paused);
                    break;
                }
            }
        }

        system->update();

        if (channel)
        {
            unsigned int ms;
            unsigned int lenms;
            bool         playing;
            bool         paused;

            channel->isPlaying(&playing);
            if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE))
            {
                ERRCHECK(result);
            }

            result = channel->getPaused(&paused);
            if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE))
            {
                ERRCHECK(result);
            }

            result = channel->getPosition(&ms, FMOD_TIMEUNIT_MS);
            if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE))
            {
                ERRCHECK(result);
            }

            result = sound->getLength(&lenms, FMOD_TIMEUNIT_MS);
            if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE))
            {
                ERRCHECK(result);
            }
			

            printf("Time %02d:%02d:%02d/%02d:%02d:%02d : %s\r", ms / 1000 / 60, ms / 1000 % 60, ms / 10 % 100, lenms / 1000 / 60, lenms / 1000 % 60, lenms / 10 % 100, paused ? "Paused " : playing ? "Playing" : "Stopped");
        }

        Sleep(10);

    } while (key != 27);

    printf("\n");

    /*
        Shut down
    */
    result = sound->release();
    ERRCHECK(result);
    result = system->close();
    ERRCHECK(result);
    result = system->release();
    ERRCHECK(result);

    return 0;
}
위와 같이 코딩을 하였습니다.
파일의 재생이 끝나게 되면 콜백을 받으려 했는데..

mycallback부분으로 넘어 오질 않네요...제가 멀잘못한건지..
여러가지 방법으로 해봤는데도 잘 안네요..이거골치가..

fmod를 사용해보신 분들의 조언부탁드리겠습니다.
mmouse77
Posts: 103
Joined: 2004-09-17 20:57
Location: NEXON

Post by mmouse77 »

Sound 오브젝트를 만들때 LOOP_NORMAL 로 옵션을 주셔서 그런 것 같습니다.
FMOD_LOOP_OFF 로 바꿔보세요
Locked