void play_click(int sound) { int snd_bf_pointer; uae_s16 gui_volume; if (!changed_prefs.gui_volume) return; if (changed_prefs.sound_stereo!=1) return; //Only stereo implemented gui_volume = 5-changed_prefs.gui_volume; if (gui_volume<0) gui_volume=0; if (gui_volume>5) gui_volume=5; audio_resume(); for(snd_bf_pointer=0; snd_bf_pointer< (len_click_buffer[sound]-sndbufsize); snd_bf_pointer+=sndbufsize) { memcpy_volume((uae_s16 *)sndbuffer, (uae_s16 *)(click_buffer_pointer[sound]+snd_bf_pointer), sndbufsize, gui_volume); finish_sound_buffer(); } memcpy(sndbuffer, click_buffer_pointer[sound] + snd_bf_pointer, len_click_buffer[sound] - snd_bf_pointer); //The last chunk memset((char *) sndbuffer + len_click_buffer[sound]-snd_bf_pointer,0, sndbufsize -(len_click_buffer[sound]- snd_bf_pointer)); finish_sound_buffer(); clearbuffer(); audio_pause(); }
void update_audio (void) { unsigned long int n_cycles; uae4all_prof_start(4); n_cycles = get_cycles () - last_cycles; for (;;) { #ifdef __arm__ asm(".align 4"); #endif register unsigned long int best_evtime = n_cycles + 1; //int addr = (int)audio_channel_evtime; //AUDIO_PREFETCH(addr); // CHECK_STATE if (best_evtime > audio_channel_evtime[0]) best_evtime = audio_channel_evtime[0]; if (best_evtime > audio_channel_evtime[1]) best_evtime = audio_channel_evtime[1]; if (best_evtime > audio_channel_evtime[2]) best_evtime = audio_channel_evtime[2]; if (best_evtime > audio_channel_evtime[3]) best_evtime = audio_channel_evtime[3]; if (best_evtime > next_sample_evtime) best_evtime = next_sample_evtime; if (best_evtime > n_cycles) break; // SUB_EVTIME next_sample_evtime -= best_evtime; audio_channel_evtime[0] -= best_evtime; audio_channel_evtime[1] -= best_evtime; audio_channel_evtime[2] -= best_evtime; audio_channel_evtime[3] -= best_evtime; n_cycles -= best_evtime; /* addr = (int)&audio_channel_current_sample; AUDIO_PREFETCH(addr); addr = (int)&audio_channel_vol; AUDIO_PREFETCH(addr); addr = (int)&audio_channel_adk_mask; AUDIO_PREFETCH(addr); */ // IF_SAMPLE if (!next_sample_evtime) { next_sample_evtime = scaled_sample_evtime; register uae_u32 d0 = audio_channel_current_sample[0]; register uae_u32 d1 = audio_channel_current_sample[1]; register uae_u32 d2 = audio_channel_current_sample[2]; register uae_u32 d3 = audio_channel_current_sample[3]; d0 *= audio_channel_vol[0]; d1 *= audio_channel_vol[1]; d2 *= audio_channel_vol[2]; d3 *= audio_channel_vol[3]; d0 &= audio_channel_adk_mask[0]; d1 &= audio_channel_adk_mask[1]; d2 &= audio_channel_adk_mask[2]; d3 &= audio_channel_adk_mask[3]; *(uae_u16 *)sndbufpt = d0+d1+d2+d3; sndbufpt = (uae_u16 *)(((uae_u8 *)sndbufpt) + 2); if ((unsigned)sndbufpt - (unsigned)render_sndbuff >= SNDBUFFER_LEN) { finish_sound_buffer (); } } // RUN_HANDLERS for (int i=0; i < 4; i++) { if (!audio_channel_evtime[i]) audio_handler(i); } /* if (!audio_channel_evtime[0]) audio_handler_0(); if (!audio_channel_evtime[1]) audio_handler_1(); if (!audio_channel_evtime[2]) audio_handler_2(); if (!audio_channel_evtime[3]) audio_handler_3(); */ } last_cycles = get_cycles () - n_cycles; uae4all_prof_end(4); }