使用SDL Mixer匹配持续时间

时间:2013-10-05 16:31:19

标签: audio sdl

我们已经定义了基本代码如下。当我们相应地按下键时,代码片段播放音乐卡盘。现在的问题是file1更短,file2稍长。我们需要将两者混合并播放它们以延长file1的持续时间以匹配file2。怎么做通过sdl?

Mix_Chunk *file1 = NULL;
Mix_Chunk *file2 = NULL;

 file1 = Mix_LoadWAV( "file1.wav" );
    file2 = Mix_LoadWAV( "file2.wav" );

   while( quit == false )
    {
        //While there's events to handle
        while( SDL_PollEvent( &event ) )
        {
            //If a key was pressed
            if( event.type == SDL_KEYDOWN )
            {
                //If 1 was pressed
                if( event.key.keysym.sym == SDLK_1 )
                {
                    //Play the scratch effect
                    if( Mix_PlayChannel( -1, file1, 0 ) == -1 )
                    {
                        return 1;
                    }
                }
                //If 2 was pressed
                else if( event.key.keysym.sym == SDLK_2 )
                {
                    //Play the high hit effect
                    if( Mix_PlayChannel( -1, file2, 0 ) == -1 )
                    {
                        return 1;
                    }
                }             

            }
            //If the user has Xed out the window
            if( event.type == SDL_QUIT )
            {
                //Quit the program
                quit = true;
            }
        }

1 个答案:

答案 0 :(得分:0)

您必须进行一些上采样或下采样。在您的情况下,您可能希望对file1进行上采样以使其更长。以下是:

// This function add samples from the original audio according to the value of "rate".
// Since the sampling rate remains the same, effectively it will cause the audio to playback slower.
void Play_UpSample (int channel, Mix_Chunk *sample, int loop, int rate)
{
    int m, n;
    Mix_Chunk *newsample = new Mix_Chunk;
    int original_length = sample->alen;
    int length = original_length * rate;    

    newsample->allocated = sample->allocated;
    newsample->abuf = NULL;
    newsample->alen = length;
    newsample->volume = sample->volume;
    Uint8 *data1 = new Uint8[length];
    Uint8 *start = sample->abuf;
    Uint8 *start1 = data1;

    int size = Get_Format();

    if (size == 32) {
        Uint32 sam;

        for (m=1; m<=original_length; m+=4) {
            sam = *((Uint32 *)start);
            for (n=1; n<=rate; n++) {
                *((Uint32 *)start1) = sam;
                start1+=4;
            }
            start+=4;
        }
    }   
    else if (size == 16) {
        Uint16 sam;
        for (m=1; m<=original_length; m+=2) {
            sam = *((Uint16 *)start);
            for (n=1; n<=rate; n++) {
                *((Uint16 *)start1) = sam;
                start1+=2;
            }
            start+=2;
        }

    }   
    else if (size == 8) {
        Uint8 sam;
        for (m=1; m<=original_length; m+=4) {
            sam = *start;
            for (n=1; n<=rate; n++) {
                *start1 = sam;
                start1++;
            }
            start++;
        }


    }   
    newsample->abuf = data1;

    Mix_PlayChannel(channel, newsample, loop);
}