// File: /workspace/github_c_makefile_star2_O3/phoboslab[P]pl_mpeg/pl_mpeg_player_sdl.c
// Function: app_update
void app_update(app_t *self) {
	double seek_to = -1;

	SDL_Event ev;
	while (SDL_PollEvent(&ev)) {
		if (
			ev.type == SDL_QUIT || 
			(ev.type == SDL_KEYUP && ev.key.keysym.sym == SDLK_ESCAPE)
		) {
			self->wants_to_quit = TRUE;
		}
		// Seek 3sec forward/backward using arrow keys
		if (ev.type == SDL_KEYDOWN && ev.key.keysym.sym == SDLK_RIGHT) {
			seek_to = plm_get_time(self->plm) + 3;
		}
		else if (ev.type == SDL_KEYDOWN && ev.key.keysym.sym == SDLK_LEFT) {
			seek_to = plm_get_time(self->plm) - 3;
		}
	}


	// Clear renderer, copy texture and present
	SDL_RenderClear(self->renderer);
        
	SDL_RenderCopy(self->renderer, self->texture, NULL, &self->rectangle);

	SDL_RenderPresent(self->renderer);

	// Compute the delta time since the last app_update(), limit max step to 
	// 1/30th of a second
	double current_time = (double)SDL_GetTicks() / 1000.0;
	double elapsed_time = current_time - self->last_time;
	if (elapsed_time > 1.0 / 30.0) {
		elapsed_time = 1.0 / 30.0;
	}
	self->last_time = current_time;

	// Seek using mouse position
	int mouse_x, mouse_y;
	if (SDL_GetMouseState(&mouse_x, &mouse_y) & SDL_BUTTON(SDL_BUTTON_LEFT)) {
		int sx, sy;
		SDL_GetWindowSize(self->window, &sx, &sy);
		seek_to = plm_get_duration(self->plm) * ((float)mouse_x / (float)sx);
	}
	
	// Seek or advance decode
	if (seek_to != -1) {
		SDL_ClearQueuedAudio(self->audio_device);
		plm_seek(self->plm, seek_to, FALSE);
	}
	else {
		plm_decode(self->plm, elapsed_time);
	}

	if (plm_has_ended(self->plm)) {
		self->wants_to_quit = TRUE;
	}
}

// Assembly:
pushq %r14
pushq %rbx
subq $0x68, %rsp
movq %rdi, %rbx
leaq 0x30(%rsp), %rdi
callq 0x20f0
movsd 0x7a3(%rip), %xmm0      # 0x9230
testl %eax, %eax
je 0x8b0a
movsd %xmm0, 0x8(%rsp)
leaq 0x30(%rsp), %r14
movl 0x30(%rsp), %eax
movl 0x44(%rsp), %ecx
cmpl $0x100, %eax            # imm = 0x100
je 0x8abc
movl %eax, %edx
xorl $0x301, %edx            # imm = 0x301
movl %ecx, %esi
xorl $0x1b, %esi
orl %edx, %esi
jne 0x8ac3
movl $0x1, 0x10(%rbx)
xorl $0x300, %eax            # imm = 0x300
movl %ecx, %edx
xorl $0x4000004f, %edx       # imm = 0x4000004F
orl %eax, %edx
movsd 0x76e(%rip), %xmm0      # 0x9248
je 0x8aee
xorl $0x40000050, %ecx       # imm = 0x40000050
orl %ecx, %eax
movsd 0x764(%rip), %xmm0      # 0x9250
jne 0x8afc
movq (%rbx), %rax
addsd 0x8(%rax), %xmm0
movsd %xmm0, 0x8(%rsp)
movq %r14, %rdi
callq 0x20f0
testl %eax, %eax
jne 0x8a9c
jmp 0x8b10
movsd %xmm0, 0x8(%rsp)
movq 0x20(%rbx), %rdi
callq 0x2160
movq 0x20(%rbx), %rdi
movq 0x28(%rbx), %rsi
leaq 0x30(%rbx), %rcx
xorl %edx, %edx
callq 0x21a0
movq 0x20(%rbx), %rdi
callq 0x2080
callq 0x2180
movl %eax, %eax
xorps %xmm0, %xmm0
cvtsi2sd %rax, %xmm0
divsd 0x70c(%rip), %xmm0      # 0x9258
movapd %xmm0, %xmm1
subsd 0x8(%rbx), %xmm1
movsd %xmm1, 0x18(%rsp)
movsd %xmm0, 0x8(%rbx)
leaq 0x14(%rsp), %rdi
leaq 0x2c(%rsp), %rsi
callq 0x2240
testb $0x1, %al
movsd 0x8(%rsp), %xmm0
je 0x8bbd
movq 0x18(%rbx), %rdi
leaq 0x28(%rsp), %r14
leaq 0x24(%rsp), %rdx
movq %r14, %rsi
callq 0x20a0
movq (%rbx), %rax
movq (%rax), %rdi
movl $0xe0, %esi
callq 0x2fc3
xorps %xmm1, %xmm1
cvtsi2ssl 0x14(%rsp), %xmm1
cvtsi2ssl (%r14), %xmm2
divss %xmm2, %xmm1
cvtss2sd %xmm1, %xmm1
mulsd %xmm0, %xmm1
movapd %xmm1, %xmm0
ucomisd 0x66b(%rip), %xmm0      # 0x9230
jne 0x8bc9
jnp 0x8be9
movl 0x40(%rbx), %edi
movsd %xmm0, 0x8(%rsp)
callq 0x2230
movq (%rbx), %rdi
movsd 0x8(%rsp), %xmm0
xorl %esi, %esi
callq 0x3e49
jmp 0x8bff
movsd 0x66f(%rip), %xmm0      # 0x9260
minsd 0x18(%rsp), %xmm0
movq (%rbx), %rdi
callq 0x327e
movq (%rbx), %rax
cmpl $0x0, 0x10(%rax)
je 0x8c0f
movl $0x1, 0x10(%rbx)
addq $0x68, %rsp
popq %rbx
popq %r14
retq