bool task_audio_mixer_load_handler(retro_task_t *task) { nbio_handle_t *nbio = (nbio_handle_t*)task->state; struct audio_mixer_handle *image = (struct audio_mixer_handle*)nbio->data; if ( nbio->is_finished && (image && !image->is_finished) && (image->copy_data_over) && (!task_get_cancelled(task))) { nbio_buf_t *img = (nbio_buf_t*)calloc(1, sizeof(*img)); if (img) { img->buf = image->buffer->buf; img->bufsize = image->buffer->bufsize; } task_set_data(task, img); image->copy_data_over = false; image->is_finished = true; return false; } return true; }
static void task_powerstate_handler(retro_task_t *task) { const frontend_ctx_driver_t *frontend = frontend_get_ptr(); powerstate_t *powerstate = (powerstate_t*)task->state; if (frontend && frontend->get_powerstate) { int seconds = 0; powerstate->state = frontend->get_powerstate(&seconds, &powerstate->percent); } task_set_data(task, powerstate); task_set_finished(task, true); }
static void task_http_transfer_handler(retro_task_t *task) { http_transfer_data_t *data = NULL; http_handle_t *http = (http_handle_t*)task->state; if (task_get_cancelled(task)) goto task_finished; switch (http->status) { case HTTP_STATUS_CONNECTION_TRANSFER_PARSE: task_http_conn_iterate_transfer_parse(http); http->status = HTTP_STATUS_TRANSFER; break; case HTTP_STATUS_CONNECTION_TRANSFER: if (!task_http_con_iterate_transfer(http)) http->status = HTTP_STATUS_CONNECTION_TRANSFER_PARSE; break; case HTTP_STATUS_TRANSFER: if (!task_http_iterate_transfer(task)) goto task_finished; break; case HTTP_STATUS_TRANSFER_PARSE: goto task_finished; default: break; } if (http->error) goto task_finished; return; task_finished: task_set_finished(task, true); if (http->handle) { size_t len = 0; char *tmp = (char*)net_http_data(http->handle, &len, false); if (tmp && http->cb) http->cb(tmp, len); if (net_http_error(http->handle) || task_get_cancelled(task)) { tmp = (char*)net_http_data(http->handle, &len, true); if (tmp) free(tmp); if (task_get_cancelled(task)) task_set_error(task, strdup("Task cancelled.")); else task_set_error(task, strdup("Download failed.")); } else { data = (http_transfer_data_t*)calloc(1, sizeof(*data)); data->data = tmp; data->len = len; task_set_data(task, data); } net_http_delete(http->handle); } else if (http->error) task_set_error(task, strdup("Internal error.")); free(http); }