void ags_switch_buffer_flag_launch(AgsTask *task) { AgsSwitchBufferFlag *switch_buffer_flag; switch_buffer_flag = AGS_SWITCH_BUFFER_FLAG(task); /* switch buffer flag */ if(AGS_IS_DEVOUT(switch_buffer_flag->device)){ ags_devout_switch_buffer_flag((AgsDevout *) switch_buffer_flag->device); }else if(AGS_IS_DEVIN(switch_buffer_flag->device)){ ags_devin_switch_buffer_flag((AgsDevin *) switch_buffer_flag->device); }else if(AGS_IS_JACK_DEVOUT(switch_buffer_flag->device)){ ags_jack_devout_switch_buffer_flag((AgsJackDevout *) switch_buffer_flag->device); }else if(AGS_IS_JACK_DEVIN(switch_buffer_flag->device)){ ags_jack_devin_switch_buffer_flag((AgsJackDevin *) switch_buffer_flag->device); }else if(AGS_IS_PULSE_DEVOUT(switch_buffer_flag->device)){ ags_pulse_devout_switch_buffer_flag((AgsPulseDevout *) switch_buffer_flag->device); }else if(AGS_IS_PULSE_DEVIN(switch_buffer_flag->device)){ ags_pulse_devin_switch_buffer_flag((AgsPulseDevin *) switch_buffer_flag->device); }else if(AGS_IS_CORE_AUDIO_DEVOUT(switch_buffer_flag->device)){ ags_core_audio_devout_switch_buffer_flag((AgsCoreAudioDevout *) switch_buffer_flag->device); }else if(AGS_IS_CORE_AUDIO_DEVIN(switch_buffer_flag->device)){ ags_core_audio_devin_switch_buffer_flag((AgsCoreAudioDevin *) switch_buffer_flag->device); }else if(AGS_IS_MIDIIN(switch_buffer_flag->device)){ ags_midiin_switch_buffer_flag((AgsMidiin *) switch_buffer_flag->device); }else if(AGS_IS_JACK_MIDIIN(switch_buffer_flag->device)){ ags_jack_midiin_switch_buffer_flag((AgsJackMidiin *) switch_buffer_flag->device); }else if(AGS_IS_CORE_AUDIO_MIDIIN(switch_buffer_flag->device)){ ags_core_audio_midiin_switch_buffer_flag((AgsCoreAudioMidiin *) switch_buffer_flag->device); } }
void ags_devout_alsa_play(AgsSoundcard *soundcard, GError **error) { AgsDevout *devout; gdouble delay; devout = AGS_DEVOUT(soundcard); devout->flags &= (~AGS_DEVOUT_START_PLAY); /* */ if((AGS_DEVOUT_BUFFER0 & (devout->flags)) != 0){ memset(devout->buffer[3], 0, (size_t) devout->dsp_channels * devout->buffer_size * sizeof(signed short)); devout->out.alsa.rc = snd_pcm_writei(devout->out.alsa.handle, devout->buffer[0], (snd_pcm_uframes_t) (devout->buffer_size)); if((AGS_DEVOUT_NONBLOCKING & (devout->flags)) == 0){ if(devout->out.alsa.rc == -EPIPE){ /* EPIPE means underrun */ snd_pcm_prepare(devout->out.alsa.handle); #ifdef AGS_DEBUG g_message("underrun occurred\0"); #endif }else if(devout->out.alsa.rc == -ESTRPIPE){ static const struct timespec idle = { 0, 4000, }; int err; while((err = snd_pcm_resume(devout->out.alsa.handle)) == -EAGAIN) nanosleep(&idle, NULL); /* wait until the suspend flag is released */ if(err < 0){ err = snd_pcm_prepare(devout->out.alsa.handle); } }else if(devout->out.alsa.rc < 0){ g_message("error from writei: %s\0", snd_strerror(devout->out.alsa.rc)); }else if(devout->out.alsa.rc != (int) devout->buffer_size) { g_message("short write, write %d frames\0", devout->out.alsa.rc); } } // g_message("ags_devout_play 0\0"); }else if((AGS_DEVOUT_BUFFER1 & (devout->flags)) != 0){ memset(devout->buffer[0], 0, (size_t) devout->dsp_channels * devout->buffer_size * sizeof(signed short)); devout->out.alsa.rc = snd_pcm_writei(devout->out.alsa.handle, devout->buffer[1], (snd_pcm_uframes_t) (devout->buffer_size)); if((AGS_DEVOUT_NONBLOCKING & (devout->flags)) == 0){ if(devout->out.alsa.rc == -EPIPE){ /* EPIPE means underrun */ snd_pcm_prepare(devout->out.alsa.handle); #ifdef AGS_DEBUG g_message("underrun occurred\0"); #endif }else if(devout->out.alsa.rc == -ESTRPIPE){ static const struct timespec idle = { 0, 4000, }; int err; while((err = snd_pcm_resume(devout->out.alsa.handle)) == -EAGAIN) nanosleep(&idle, NULL); /* wait until the suspend flag is released */ if(err < 0){ err = snd_pcm_prepare(devout->out.alsa.handle); } }else if(devout->out.alsa.rc < 0){ g_message("error from writei: %s\0", snd_strerror(devout->out.alsa.rc)); }else if(devout->out.alsa.rc != (int) devout->buffer_size) { g_message("short write, write %d frames\0", devout->out.alsa.rc); } } // g_message("ags_devout_play 1\0"); }else if((AGS_DEVOUT_BUFFER2 & (devout->flags)) != 0){ memset(devout->buffer[1], 0, (size_t) devout->dsp_channels * devout->buffer_size * sizeof(signed short)); devout->out.alsa.rc = snd_pcm_writei(devout->out.alsa.handle, devout->buffer[2], (snd_pcm_uframes_t) (devout->buffer_size)); if((AGS_DEVOUT_NONBLOCKING & (devout->flags)) == 0){ if(devout->out.alsa.rc == -EPIPE){ /* EPIPE means underrun */ snd_pcm_prepare(devout->out.alsa.handle); #ifdef AGS_DEBUG g_message("underrun occurred\0"); #endif }else if(devout->out.alsa.rc == -ESTRPIPE){ static const struct timespec idle = { 0, 4000, }; int err; while((err = snd_pcm_resume(devout->out.alsa.handle)) == -EAGAIN) nanosleep(&idle, NULL); /* wait until the suspend flag is released */ if(err < 0){ err = snd_pcm_prepare(devout->out.alsa.handle); } }else if(devout->out.alsa.rc < 0){ g_message("error from writei: %s\0", snd_strerror(devout->out.alsa.rc)); }else if(devout->out.alsa.rc != (int) devout->buffer_size) { g_message("short write, write %d frames\0", devout->out.alsa.rc); } } // g_message("ags_devout_play 2\0"); }else if((AGS_DEVOUT_BUFFER3 & devout->flags) != 0){ memset(devout->buffer[2], 0, (size_t) devout->dsp_channels * devout->buffer_size * sizeof(signed short)); devout->out.alsa.rc = snd_pcm_writei(devout->out.alsa.handle, devout->buffer[3], (snd_pcm_uframes_t) (devout->buffer_size)); if((AGS_DEVOUT_NONBLOCKING & (devout->flags)) == 0){ if(devout->out.alsa.rc == -EPIPE){ snd_pcm_prepare(devout->out.alsa.handle); #ifdef AGS_DEBUG g_message("underrun occurred\0"); #endif }else if(devout->out.alsa.rc == -ESTRPIPE){ static const struct timespec idle = { 0, 4000, }; int err; while((err = snd_pcm_resume(devout->out.alsa.handle)) == -EAGAIN) nanosleep(&idle, NULL); /* wait until the suspend flag is released */ if(err < 0){ err = snd_pcm_prepare(devout->out.alsa.handle); } }else if(devout->out.alsa.rc < 0){ g_message("error from writei: %s\0", snd_strerror(devout->out.alsa.rc)); }else if(devout->out.alsa.rc != (int) devout->buffer_size) { g_message("short write, write %d frames\0", devout->out.alsa.rc); } } // g_message("ags_devout_play 3\0"); } /* tic */ ags_soundcard_tic(soundcard); /* reset - switch buffer flags */ ags_devout_switch_buffer_flag(devout); snd_pcm_prepare(devout->out.alsa.handle); }
void ags_devout_alsa_play(AgsDevout *devout, GError **error) { /* */ if((AGS_DEVOUT_BUFFER0 & (devout->flags)) != 0){ memset(devout->buffer[3], 0, (size_t) devout->dsp_channels * devout->buffer_size * sizeof(signed short)); devout->out.alsa.rc = snd_pcm_writei(devout->out.alsa.handle, devout->buffer[0], (snd_pcm_uframes_t) (devout->buffer_size)); if((AGS_DEVOUT_NONBLOCKING & (devout->flags)) == 0){ if(devout->out.alsa.rc == -EPIPE){ /* EPIPE means underrun */ snd_pcm_prepare(devout->out.alsa.handle); #ifdef AGS_DEBUG g_message("underrun occurred\0"); #endif }else if(devout->out.alsa.rc == -ESTRPIPE){ static const struct timespec idle = { 0, 4000, }; int err; while((err = snd_pcm_resume(devout->out.alsa.handle)) == -EAGAIN) nanosleep(&idle, NULL); /* wait until the suspend flag is released */ if(err < 0){ err = snd_pcm_prepare(devout->out.alsa.handle); } }else if(devout->out.alsa.rc < 0){ g_message("error from writei: %s\0", snd_strerror(devout->out.alsa.rc)); }else if(devout->out.alsa.rc != (int) devout->buffer_size) { g_message("short write, write %d frames\0", devout->out.alsa.rc); } } // g_message("ags_devout_play 0\0"); }else if((AGS_DEVOUT_BUFFER1 & (devout->flags)) != 0){ memset(devout->buffer[0], 0, (size_t) devout->dsp_channels * devout->buffer_size * sizeof(signed short)); devout->out.alsa.rc = snd_pcm_writei(devout->out.alsa.handle, devout->buffer[1], (snd_pcm_uframes_t) (devout->buffer_size)); if((AGS_DEVOUT_NONBLOCKING & (devout->flags)) == 0){ if(devout->out.alsa.rc == -EPIPE){ /* EPIPE means underrun */ snd_pcm_prepare(devout->out.alsa.handle); #ifdef AGS_DEBUG g_message("underrun occurred\0"); #endif }else if(devout->out.alsa.rc == -ESTRPIPE){ static const struct timespec idle = { 0, 4000, }; int err; while((err = snd_pcm_resume(devout->out.alsa.handle)) == -EAGAIN) nanosleep(&idle, NULL); /* wait until the suspend flag is released */ if(err < 0){ err = snd_pcm_prepare(devout->out.alsa.handle); } }else if(devout->out.alsa.rc < 0){ g_message("error from writei: %s\0", snd_strerror(devout->out.alsa.rc)); }else if(devout->out.alsa.rc != (int) devout->buffer_size) { g_message("short write, write %d frames\0", devout->out.alsa.rc); } } // g_message("ags_devout_play 1\0"); }else if((AGS_DEVOUT_BUFFER2 & (devout->flags)) != 0){ memset(devout->buffer[1], 0, (size_t) devout->dsp_channels * devout->buffer_size * sizeof(signed short)); devout->out.alsa.rc = snd_pcm_writei(devout->out.alsa.handle, devout->buffer[2], (snd_pcm_uframes_t) (devout->buffer_size)); if((AGS_DEVOUT_NONBLOCKING & (devout->flags)) == 0){ if(devout->out.alsa.rc == -EPIPE){ /* EPIPE means underrun */ snd_pcm_prepare(devout->out.alsa.handle); #ifdef AGS_DEBUG g_message("underrun occurred\0"); #endif }else if(devout->out.alsa.rc == -ESTRPIPE){ static const struct timespec idle = { 0, 4000, }; int err; while((err = snd_pcm_resume(devout->out.alsa.handle)) == -EAGAIN) nanosleep(&idle, NULL); /* wait until the suspend flag is released */ if(err < 0){ err = snd_pcm_prepare(devout->out.alsa.handle); } }else if(devout->out.alsa.rc < 0){ g_message("error from writei: %s\0", snd_strerror(devout->out.alsa.rc)); }else if(devout->out.alsa.rc != (int) devout->buffer_size) { g_message("short write, write %d frames\0", devout->out.alsa.rc); } } // g_message("ags_devout_play 2\0"); }else if((AGS_DEVOUT_BUFFER3 & devout->flags) != 0){ memset(devout->buffer[2], 0, (size_t) devout->dsp_channels * devout->buffer_size * sizeof(signed short)); devout->out.alsa.rc = snd_pcm_writei(devout->out.alsa.handle, devout->buffer[3], (snd_pcm_uframes_t) (devout->buffer_size)); if((AGS_DEVOUT_NONBLOCKING & (devout->flags)) == 0){ if(devout->out.alsa.rc == -EPIPE){ snd_pcm_prepare(devout->out.alsa.handle); #ifdef AGS_DEBUG g_message("underrun occurred\0"); #endif }else if(devout->out.alsa.rc == -ESTRPIPE){ static const struct timespec idle = { 0, 4000, }; int err; while((err = snd_pcm_resume(devout->out.alsa.handle)) == -EAGAIN) nanosleep(&idle, NULL); /* wait until the suspend flag is released */ if(err < 0){ err = snd_pcm_prepare(devout->out.alsa.handle); } }else if(devout->out.alsa.rc < 0){ g_message("error from writei: %s\0", snd_strerror(devout->out.alsa.rc)); }else if(devout->out.alsa.rc != (int) devout->buffer_size) { g_message("short write, write %d frames\0", devout->out.alsa.rc); } } // g_message("ags_devout_play 3\0"); } /* determine if attack should be switched */ devout->delay_counter += 1; //AGS_DEVOUT_DEFAULT_JIFFIE ///TODO:JK: fix me if(devout->delay_counter >= AGS_DEVOUT_DEFAULT_DELAY){ //devout->delay[devout->tic_counter] /* tic */ ags_devout_tic(devout); devout->tic_counter += 1; if(devout->tic_counter == AGS_NOTATION_TICS_PER_BEAT){ devout->tic_counter = 0; } /* delay */ devout->delay_counter = 0; } /* switch buffer flags */ ags_devout_switch_buffer_flag(devout); snd_pcm_prepare(devout->out.alsa.handle); }