Exemple #1
0
error_code cellAudioCreateNotifyEventQueue(vm::ptr<u32> id, vm::ptr<u64> key)
{
	cellAudio.warning("cellAudioCreateNotifyEventQueue(id=*0x%x, key=*0x%x)", id, key);

	vm::var<sys_event_queue_attribute_t> attr;
	attr->protocol = SYS_SYNC_FIFO;
	attr->type     = SYS_PPU_QUEUE;
	attr->name_u64 = 0;

	for (u64 i = 0; i < 100; i++)
	{
		// Create an event queue "bruteforcing" an available key
		const u64 key_value = 0x80004d494f323221ull + i;

		if (const s32 res = sys_event_queue_create(id, attr, key_value, 32))
		{
			if (res != CELL_EEXIST)
			{
				return res;
			}
		}
		else
		{
			*key = key_value;
			return CELL_OK;
		}
	}

	return CELL_AUDIO_ERROR_EVENT_QUEUE;
}
int
sampleSpursUtilSpuPrintfServiceInitialize(SampleUtilSpursPrintfService *service, CellSpurs* spurs, int prio)
{
	int	ret;
	service->spurs = spurs;

	/* create event_queue for printf */
	sys_event_queue_attribute_t	attr;
	sys_event_queue_attribute_initialize (attr);

	/* queue depth must be equal or greater than max_spu_threads */
	ret = sys_event_queue_create (&service->equeue, &attr, SYS_EVENT_QUEUE_LOCAL, 8);
	if (ret) {
		printf ("sys_event_queue_create failed (%d)\n", ret);
		return ret;
	}

	/* 		create ppu_thread for printf handling */
	ret = sys_ppu_thread_create (&service->spu_printf_handler, spu_printf_handler_entry,
								 (uint64_t)(uintptr_t)service, prio, STACK_SIZE, SYS_PPU_THREAD_CREATE_JOINABLE, 
								 "spu_printf_handler");
	if (ret) {
		printf ("sys_ppu_thread_create failed (%d)\n", ret);
		return ret;
	}

	/*
	 * Create the terminating port. This port is used only in 
	 * spu_printf_service_finalize().
	 */
	ret = sys_event_port_create(&service->terminating_port, SYS_EVENT_PORT_LOCAL, TERMINATING_PORT_NAME);
	if (ret) {
		printf ("spu_printf_server_initialize: sys_event_port_create failed %d\n", ret);
		return ret;
	}

	ret = sys_event_port_connect_local(service->terminating_port, service->equeue);
	if (ret) {
		printf ("spu_printf_server_initialize: sys_event_connect failed %d\n", ret);
		return ret;
	}

	/* connect to SPURS */
	uint8_t	port = SPU_PORT_PRINTF;
	ret = cellSpursAttachLv2EventQueue (service->spurs, service->equeue, &port, 0);
	if (ret) {
		printf ("spu_printf_server_initialize: cellSpursAttachLv2EventQueue failed %d\n", ret);
		return ret;
	}
	return CELL_OK;
}