void sound_init() { // Initialise the hardware. We make use of the SSC module. sound_interrupt_disable(); sound_disable(); *AT91C_PMC_PCER = (1 << AT91C_ID_SSC); *AT91C_PIOA_ODR = AT91C_PA17_TD; *AT91C_PIOA_OWDR = AT91C_PA17_TD; *AT91C_PIOA_MDDR = AT91C_PA17_TD; *AT91C_PIOA_PPUDR = AT91C_PA17_TD; *AT91C_PIOA_IFDR = AT91C_PA17_TD; *AT91C_PIOA_CODR = AT91C_PA17_TD; *AT91C_PIOA_IDR = AT91C_PA17_TD; *AT91C_SSC_CR = AT91C_SSC_SWRST; *AT91C_SSC_TCMR = AT91C_SSC_CKS_DIV + AT91C_SSC_CKO_CONTINOUS + AT91C_SSC_START_CONTINOUS; *AT91C_SSC_TFMR = 31 + (7 << 8) + AT91C_SSC_MSBF; // 8 32-bit words *AT91C_SSC_CR = AT91C_SSC_TXEN; aic_mask_on(AT91C_ID_SSC); aic_clear(AT91C_ID_SSC); aic_set_vector(AT91C_ID_SSC, AT91C_AIC_PRIOR_LOWEST | AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED, (U32)sound_isr_entry); /*PG*/ sample.buf_id = 0; sample.cur_vol = -1; sample.sample_buf = NULL; }
void sound_toggle(void) { #ifdef Z80_EMULATED //puts("sound_toggle"); if (!(sound_muted&0x2)) { if (sound_muted&0x1) sound_enable(); else sound_disable(); } #endif }
void sound_isr_C() { //U64 s = systick_get_ns(); if (sample.count > 0) { // refill the buffer, and adjust any clocks *AT91C_SSC_CMR = sample.clock_div; sound_enable(); if (*AT91C_SSC_TCR == 0) { if (sound_mode == SOUND_MODE_PCM) { sound_fill_sample_buffer(); *AT91C_SSC_TPR = (unsigned int)sample.buf[sample.buf_id]; } else *AT91C_SSC_TPR = (unsigned int)sample.ptr; *AT91C_SSC_TCR = sample.len; sample.count--; } if (sound_mode == SOUND_MODE_PCM) { sound_fill_sample_buffer(); *AT91C_SSC_TNPR = (unsigned int)sample.buf[sample.buf_id]; } else *AT91C_SSC_TNPR = (unsigned int)sample.ptr; *AT91C_SSC_TNCR = sample.len; sample.count--; // If this is the last sample wait for it to complete, otherwise wait // to switch buffers sound_interrupt_enable(AT91C_SSC_ENDTX); } else { sound_disable(); sound_interrupt_disable(); } //ttime += (systick_get_ns() - s); }