comparison mediaplayer.c @ 2376:1c09f5be285b

Very basic UI for media player
author Michael Pavone <pavone@retrodev.com>
date Fri, 17 Nov 2023 01:05:32 -0800
parents 02c04196c2da
children 30e59954eab9
comparison
equal deleted inserted replaced
2375:02c04196c2da 2376:1c09f5be285b
17 enum { 17 enum {
18 AUDIO_VGM, 18 AUDIO_VGM,
19 AUDIO_WAVE, 19 AUDIO_WAVE,
20 AUDIO_FLAC, 20 AUDIO_FLAC,
21 MEDIA_UNKNOWN 21 MEDIA_UNKNOWN
22 };
23
24 enum {
25 STATE_PLAY,
26 STATE_PAUSED
27 }; 22 };
28 23
29 uint32_t cycles_to_samples(uint32_t clock_rate, uint32_t cycles) 24 uint32_t cycles_to_samples(uint32_t clock_rate, uint32_t cycles)
30 { 25 {
31 return ((uint64_t)cycles) * ((uint64_t)44100) / ((uint64_t)clock_rate); 26 return ((uint64_t)cycles) * ((uint64_t)44100) / ((uint64_t)clock_rate);
462 { 457 {
463 uint32_t sample_size = player->wave->bits_per_sample * player->wave->num_channels / 8; 458 uint32_t sample_size = player->wave->bits_per_sample * player->wave->num_channels / 8;
464 if (sample_size > player->media->size || player->current_offset > player->media->size - sample_size) { 459 if (sample_size > player->media->size || player->current_offset > player->media->size - sample_size) {
465 player->current_offset = player->wave->format_header.size + offsetof(wave_header, audio_format); 460 player->current_offset = player->wave->format_header.size + offsetof(wave_header, audio_format);
466 player->state = STATE_PAUSED; 461 player->state = STATE_PAUSED;
462 player->playback_time = 0;
467 return; 463 return;
468 } 464 }
469 if (player->wave->bits_per_sample == 16) { 465 if (player->wave->bits_per_sample == 16) {
470 int16_t value = read_word_le(player); 466 int16_t value = read_word_le(player);
471 if (player->wave->num_channels == 1) { 467 if (player->wave->num_channels == 1) {
496 int16_t samples[2]; 492 int16_t samples[2];
497 if (flac_get_sample(player->flac, samples, 2)) { 493 if (flac_get_sample(player->flac, samples, 2)) {
498 render_put_stereo_sample(player->audio, samples[0], samples[1]); 494 render_put_stereo_sample(player->audio, samples[0], samples[1]);
499 } else { 495 } else {
500 player->state = STATE_PAUSED; 496 player->state = STATE_PAUSED;
497 player->playback_time = 0;
501 return; 498 return;
502 } 499 }
503 } 500 }
504 } 501 }
505 502
652 while (!player->header.should_exit && !player->should_return) 649 while (!player->header.should_exit && !player->should_return)
653 { 650 {
654 switch (player->state) 651 switch (player->state)
655 { 652 {
656 case STATE_PLAY: 653 case STATE_PLAY:
654 player->playback_time++;
657 switch(player->media_type) 655 switch(player->media_type)
658 { 656 {
659 case AUDIO_VGM: 657 case AUDIO_VGM:
660 vgm_frame(player); 658 vgm_frame(player);
661 break; 659 break;