我们已经定义了基本代码如下。当我们相应地按下键时,代码片段播放音乐卡盘。现在的问题是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;
}
}
答案 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);
}