status_t ice1712_buffer_exchange(ice1712 *card, multi_buffer_info *data) { int cpu_status = 0, status; /* unsigned char peak[MAX_ADC]; int i; */ // TRACE("Avant Exchange p : %d, r : %d\n", data->playback_buffer_cycle, data->record_buffer_cycle); status = acquire_sem_etc(card->buffer_ready_sem, 1, B_RELATIVE_TIMEOUT | B_CAN_INTERRUPT, 50000); switch (status) { case B_NO_ERROR: // TRACE("B_NO_ERROR\n"); cpu_status = disable_interrupts(); // Playback buffers info data->played_real_time = card->played_time; data->played_frames_count = card->frames_count; data->playback_buffer_cycle = (card->buffer - 1) % SWAPPING_BUFFERS; //Buffer played // Record buffers info data->recorded_real_time = card->played_time; data->recorded_frames_count = card->frames_count; data->record_buffer_cycle = (card->buffer - 1) % SWAPPING_BUFFERS; //Buffer filled data->flags = B_MULTI_BUFFER_PLAYBACK | B_MULTI_BUFFER_RECORD; restore_interrupts(cpu_status); break; case B_BAD_SEM_ID: TRACE("B_BAD_SEM_ID\n"); break; case B_INTERRUPTED: TRACE("B_INTERRUPTED\n"); break; case B_BAD_VALUE: TRACE("B_BAD_VALUE\n"); break; case B_WOULD_BLOCK: TRACE("B_WOULD_BLOCK\n"); break; case B_TIMED_OUT: TRACE("B_TIMED_OUT\n"); start_DMA(card); cpu_status = lock(); data->played_real_time = card->played_time; data->playback_buffer_cycle = 0; data->played_frames_count += card->buffer_size; data->recorded_real_time = card->played_time; data->record_buffer_cycle = 0; data->recorded_frames_count += card->buffer_size; data->flags = B_MULTI_BUFFER_PLAYBACK | B_MULTI_BUFFER_RECORD; unlock(cpu_status); break; default: TRACE("Default\n"); break; } if ((card->buffer % 1500) == 0) { uint8 reg8, reg8_dir; reg8 = read_gpio(card); reg8_dir = read_cci_uint8(card, CCI_GPIO_DIRECTION_CONTROL); TRACE("DEBUG === GPIO = %d (dir %d)\n", reg8, reg8_dir); reg8 = spdif_read(card, CS84xx_VERSION_AND_CHIP_ID); TRACE("DEBUG === S/PDif Version : 0x%x\n", reg8); } return B_OK; }
uint8 read_gpio(ice1712 *ice) {//return -1 if error else return an uint8 return read_cci_uint8(ice, CCI_GPIO_DATA); }