Simple sound wave generator with SDL in c++

前端 未结 4 599
孤城傲影
孤城傲影 2020-12-13 22:36

i am having problems understanding how the audio part of the sdl library works now, i know that when you initialize it, you have to specify the frequency and a >>callback<

4条回答
  •  刺人心
    刺人心 (楼主)
    2020-12-13 23:08

    A boiled-down variant of the beeper-example, reduced to the bare minimum (with error-handling).

    #include 
    #include 
    #include 
    
    const int AMPLITUDE = 28000;
    const int SAMPLE_RATE = 44100;
    
    void audio_callback(void *user_data, Uint8 *raw_buffer, int bytes)
    {
        Sint16 *buffer = (Sint16*)raw_buffer;
        int length = bytes / 2; // 2 bytes per sample for AUDIO_S16SYS
        int &sample_nr(*(int*)user_data);
    
        for(int i = 0; i < length; i++, sample_nr++)
        {
            double time = (double)sample_nr / (double)SAMPLE_RATE;
            buffer[i] = (Sint16)(AMPLITUDE * sin(2.0f * M_PI * 441.0f * time)); // render 441 HZ sine wave
        }
    }
    
    int main(int argc, char *argv[])
    {
        if(SDL_Init(SDL_INIT_AUDIO) != 0) SDL_Log("Failed to initialize SDL: %s", SDL_GetError());
    
        int sample_nr = 0;
    
        SDL_AudioSpec want;
        want.freq = SAMPLE_RATE; // number of samples per second
        want.format = AUDIO_S16SYS; // sample type (here: signed short i.e. 16 bit)
        want.channels = 1; // only one channel
        want.samples = 2048; // buffer-size
        want.callback = audio_callback; // function SDL calls periodically to refill the buffer
        want.userdata = &sample_nr; // counter, keeping track of current sample number
    
        SDL_AudioSpec have;
        if(SDL_OpenAudio(&want, &have) != 0) SDL_LogError(SDL_LOG_CATEGORY_AUDIO, "Failed to open audio: %s", SDL_GetError());
        if(want.format != have.format) SDL_LogError(SDL_LOG_CATEGORY_AUDIO, "Failed to get the desired AudioSpec");
    
        SDL_PauseAudio(0); // start playing sound
        SDL_Delay(1000); // wait while sound is playing
        SDL_PauseAudio(1); // stop playing sound
    
        SDL_CloseAudio();
    
        return 0;
    }
    

提交回复
热议问题