3 #include "io/status_loggers.h"
5 #include "drv/audio/ac97.h"
6 #include "sys/scheduler.h"
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;
17 size_t miniplay_anim_pos = 0;
21 void miniplay_display() {
23 clean_tty_screen_no_update();
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);
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));
35 _tty_printf(
"%02d:%02d / %02d:%02d\n\n",
36 current_seconds_precise / 60,
37 current_seconds_precise % 60,
41 _tty_printf(
"%*s> > > >\n", miniplay_anim_pos,
"");
42 _tty_printf(
"%*s< < < <", 5 - miniplay_anim_pos,
"");
46 if(miniplay_anim_pos > 5) {
47 miniplay_anim_pos = 0;
56 uint32_t miniplay(uint32_t argc,
char* args[]) {
58 tty_error(
"No arguments!\n");
62 if(!ac97_is_initialized()) {
63 tty_error(
"AC'97 is not initialized!");
67 miniplay_pages_total = 0;
68 miniplay_pages_played = 0;
69 miniplay_filesize = 0;
70 memset(&miniplay_hdr, 0,
sizeof miniplay_hdr);
72 char* filename = args[1];
73 miniplay_filename = filename;
78 tty_error(
"Failed to open a file!\n");
82 fseek(file, 0, SEEK_END);
84 miniplay_filesize =
ftell(file);
86 fseek(file, 0, SEEK_SET);
88 fread(file, 1,
sizeof miniplay_hdr, &miniplay_hdr);
90 fseek(file, 0xae, SEEK_SET);
92 char* data = kmalloc(miniplay_filesize);
93 fread(file, miniplay_filesize, 1, data);
95 set_cursor_enabled(
false);
98 thread_t* display_thread = thread_create(
get_current_proc(), miniplay_display, 0x1000,
true,
false);
100 ac97_set_pcm_sample_rate(miniplay_hdr.sampleRate);
102 ac97_set_master_volume(2, 2,
false);
103 ac97_set_pcm_volume(2, 2,
false);
105 miniplay_timestamp = timestamp();
107 ac97_WriteAll(data, miniplay_filesize);
109 ac97_reset_channel();
118 set_cursor_enabled(
true);
Основные определения ядра
void * memset(void *ptr, char value, size_t num)
Заполнение массива указанными символами
volatile process_t * get_current_proc(void)
Получить текущий обработчик процесса
void thread_exit(thread_t *thread)
Завершить текущий поток
ssize_t fseek(FILE *stream, ssize_t offset, uint8_t whence)
Установка позиции в потоке данных относительно текущей позиции
void fclose(FILE *stream)
Закончить работу с файлом
FILE * fopen(const char *filename, const char *_mode)
Открывает файл
int ftell(FILE *stream)
Текущая позиция считывания в файле
int fread(FILE *stream, size_t count, size_t size, void *buffer)
Чтение файла
Структура файла. Требуется для работы с VFS.
void sleep_ms(uint32_t milliseconds)
Ожидание по миллисекундам