static int __out_write(struct _reent *r, int fd, const char *ptr, int len) { u32 level; u16 l; if (!ptr || len <= 0) return -1; LWP_MutexLock(console_mutex); if (video_active) { dot_video->write_r(r, fd, ptr, len); } else { if (log_active) { l = (log_next + 1) % log_size; if (log[l]) free(log[l]); log[l] = strndup(ptr, len); log_next = l; } } if (gecko) { level = IRQ_Disable(); usb_sendbuffer(1, ptr, len); IRQ_Restore(level); } LWP_MutexUnlock(console_mutex); return len; }
void ds3wiibt_listen(struct ds3wiibt_context *ctx) { u32 level = IRQ_Disable(); if (ctx->status == DS3WIIBT_STATUS_DISCONNECTED) { ctx->status = DS3WIIBT_STATUS_LISTENING; ctx->ctrl_pcb = l2cap_new(); ctx->data_pcb = l2cap_new(); l2cap_arg(ctx->ctrl_pcb, ctx); l2cap_arg(ctx->data_pcb, ctx); l2cap_connect_ind(ctx->ctrl_pcb, &ctx->bdaddr, HIDP_PSM, l2ca_connect_ind_cb); l2cap_connect_ind(ctx->data_pcb, &ctx->bdaddr, INTR_PSM, l2ca_connect_ind_cb); } IRQ_Restore(level); }
static ssize_t __out_write(struct _reent *r, int fd, const char *ptr, size_t len) { u32 level; if (!ptr || len <= 0 || !gecko) return -1; LWP_MutexLock(gecko_mutex); level = IRQ_Disable(); usb_sendbuffer(1, ptr, len); IRQ_Restore(level); LWP_MutexUnlock(gecko_mutex); return len; }
static int wii_audio_start(audio_mode_t *am, audio_fifo_t *af) { audio_buf_t *ab; int tbuf = 0, i; uint32_t level; int64_t pts; media_pipe_t *mp; prop_sub_t *s_vol; s_vol = prop_subscribe(PROP_SUB_DIRECT_UPDATE, PROP_TAG_CALLBACK_FLOAT, set_mastervol, NULL, PROP_TAG_ROOT, prop_mastervol, NULL); LWP_InitQueue(&audio_queue); AUDIO_SetDSPSampleRate(AI_SAMPLERATE_48KHZ); AUDIO_RegisterDMACallback(switch_buffers); AUDIO_StartDMA(); while(1) { level = IRQ_Disable(); while(tbuf == cur_buffer) LWP_ThreadSleep(audio_queue); tbuf = cur_buffer; IRQ_Restore(level); ab = af_deq(af, 0); if(am != audio_mode_current) { /* We're not the selected audio output anymore, return. */ if(ab != NULL) ab_free(ab); break; } if(ab != NULL) { const int16_t *src = (const int16_t *)ab->ab_data; int16_t *dst = (int16_t *)buffer[!tbuf]; for(i = 0; i < ADMA_BUFFER_SIZE / 2; i++) *dst++ = (*src++ * audio_vol) >> 16; /* PTS is the time of the first frame of this audio packet */ if((pts = ab->ab_pts) != AV_NOPTS_VALUE && ab->ab_mp != NULL) { #if 0 /* Convert the frame delay into micro seconds */ d = (fr * 1000 / aam->aam_sample_rate) * 1000; /* Subtract it from our timestamp, this will yield the PTS for the sample currently played */ pts -= d; /* Offset with user configure delay */ #endif pts += am->am_audio_delay * 1000; mp = ab->ab_mp; hts_mutex_lock(&mp->mp_clock_mutex); mp->mp_audio_clock = pts; mp->mp_audio_clock_realtime = showtime_get_ts(); mp->mp_audio_clock_epoch = ab->ab_epoch; hts_mutex_unlock(&mp->mp_clock_mutex); } ab_free(ab); } else { memset(buffer[!tbuf], 0, ADMA_BUFFER_SIZE); } DCFlushRange(buffer[!tbuf], ADMA_BUFFER_SIZE); }