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 }
common.h
Основные определения ядра
memset
void * memset(void *ptr, char value, size_t num)
Заполнение массива указанными символами
Definition: string.c:203
get_current_proc
volatile process_t * get_current_proc(void)
Получить текущий обработчик процесса
Definition: scheduler.c:125
thread_exit
void thread_exit(thread_t *thread)
Завершить текущий поток
Definition: scheduler.c:231
fseek
ssize_t fseek(FILE *stream, ssize_t offset, uint8_t whence)
Установка позиции в потоке данных относительно текущей позиции
Definition: stdio.c:315
fclose
void fclose(FILE *stream)
Закончить работу с файлом
Definition: stdio.c:213
fopen
FILE * fopen(const char *filename, const char *_mode)
Открывает файл
Definition: stdio.c:166
ftell
int ftell(FILE *stream)
Текущая позиция считывания в файле
Definition: stdio.c:287
fread
int fread(FILE *stream, size_t count, size_t size, void *buffer)
Чтение файла
Definition: stdio.c:250
FILE
Структура файла. Требуется для работы с VFS.
Definition: stdio.h:21
sleep_ms
void sleep_ms(uint32_t milliseconds)
Ожидание по миллисекундам
Definition: timer.c:68