SayoriOS  0.3.3
miniplay.c
1 #include <common.h>
2 #include <fmt/wav.h>
3 #include "io/status_loggers.h"
4 #include "mem/vmm.h"
5 #include "drv/audio/ac97.h"
6 #include "sys/scheduler.h"
7 #include "sys/timer.h"
8 #include "lib/stdio.h"
9 
10 char* miniplay_filename;
11 size_t miniplay_pages_total = 0;
12 size_t miniplay_pages_played = 0;
13 size_t miniplay_filesize = 0;
14 size_t miniplay_timestamp = 0;
15 WAVHeader miniplay_hdr;
16 
17 size_t miniplay_anim_pos = 0;
18 
19 // Duration = File Size / (Sample Rate * Number of Channels * Sample Width)
20 
21 void miniplay_display() {
22  while(1) {
23  clean_tty_screen_no_update();
24 
25  _tty_printf("Miniplay by NDRAEY (c) 2023\n\n");
26  _tty_printf("Now playing - %s\n\n", miniplay_filename);
27  _tty_printf("Channels: %d\n", miniplay_hdr.numChannels);
28  _tty_printf("Sample rate: %d\n", miniplay_hdr.sampleRate);
29  _tty_printf("Byte rate: %d\n", miniplay_hdr.byteRate);
30  _tty_printf("Bits per sample: %d\n\n", miniplay_hdr.bitsPerSample);
31 
32  size_t current_seconds_precise = (timestamp() - miniplay_timestamp) / 1000;
33  size_t total_seconds = miniplay_filesize / (miniplay_hdr.sampleRate * miniplay_hdr.numChannels * (miniplay_hdr.bitsPerSample >> 3));
34 
35  _tty_printf("%02d:%02d / %02d:%02d\n\n",
36  current_seconds_precise / 60,
37  current_seconds_precise % 60,
38  total_seconds / 60,
39  total_seconds % 60);
40 
41  _tty_printf("%*s> > > >\n", miniplay_anim_pos, "");
42  _tty_printf("%*s< < < <", 5 - miniplay_anim_pos, "");
43 
44  miniplay_anim_pos++;
45 
46  if(miniplay_anim_pos > 5) {
47  miniplay_anim_pos = 0;
48  }
49 
50  punch();
51 
52  sleep_ms(250);
53  }
54 }
55 
56 uint32_t miniplay(uint32_t argc, char* args[]) {
57  if(argc < 1) {
58  tty_error("No arguments!\n");
59  return 1;
60  }
61 
62  if(!ac97_is_initialized()) {
63  tty_error("AC'97 is not initialized!");
64  return 1;
65  }
66 
67  miniplay_pages_total = 0;
68  miniplay_pages_played = 0;
69  miniplay_filesize = 0;
70  memset(&miniplay_hdr, 0, sizeof miniplay_hdr);
71 
72  char* filename = args[1];
73  miniplay_filename = filename;
74 
75  FILE* file = fopen(filename, "rb");
76 
77  if(!file) {
78  tty_error("Failed to open a file!\n");
79  return 1;
80  }
81 
82  fseek(file, 0, SEEK_END);
83 
84  miniplay_filesize = ftell(file);
85 
86  fseek(file, 0, SEEK_SET);
87 
88  fread(file, 1, sizeof miniplay_hdr, &miniplay_hdr);
89 
90  fseek(file, 0xae, SEEK_SET);
91 
92  char* data = kmalloc(miniplay_filesize);
93  fread(file, miniplay_filesize, 1, data);
94 
95  set_cursor_enabled(false);
96 
97  // Thread.
98  thread_t* display_thread = thread_create(get_current_proc(), miniplay_display, 0x1000, true, false);
99 
100  ac97_set_pcm_sample_rate(miniplay_hdr.sampleRate);
101 
102  ac97_set_master_volume(2, 2, false);
103  ac97_set_pcm_volume(2, 2, false);
104 
105  miniplay_timestamp = timestamp();
106 
107  ac97_WriteAll(data, miniplay_filesize);
108 
109  ac97_reset_channel();
110 
111  kfree(data);
112  fclose(file);
113 
114  thread_exit(display_thread);
115 
116  clean_tty_screen();
117 
118  set_cursor_enabled(true);
119 
120  return 0;
121 }
Основные определения ядра
void * memset(void *ptr, char value, size_t num)
Заполнение массива указанными символами
Definition: string.c:203
volatile process_t * get_current_proc(void)
Получить текущий обработчик процесса
Definition: scheduler.c:125
void thread_exit(thread_t *thread)
Завершить текущий поток
Definition: scheduler.c:231
ssize_t fseek(FILE *stream, ssize_t offset, uint8_t whence)
Установка позиции в потоке данных относительно текущей позиции
Definition: stdio.c:315
void fclose(FILE *stream)
Закончить работу с файлом
Definition: stdio.c:213
FILE * fopen(const char *filename, const char *_mode)
Открывает файл
Definition: stdio.c:166
int ftell(FILE *stream)
Текущая позиция считывания в файле
Definition: stdio.c:287
int fread(FILE *stream, size_t count, size_t size, void *buffer)
Чтение файла
Definition: stdio.c:250
Структура файла. Требуется для работы с VFS.
Definition: stdio.h:21
void sleep_ms(uint32_t milliseconds)
Ожидание по миллисекундам
Definition: timer.c:68