|
|
  |
STM32 mp3 playback |
|
|
|
Jan 27 2009, 01:16
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(Rst7 @ Jan 26 2009, 03:37)  Что значит "найти"? Последовательное чтение файла предполагает следующие переменные:
var1 - Смещение в текущем секторе var2 - Номер сектора в кластере (может быть склеено вместе с п.1) var3 - Номер текущего кластера
Собственно алгоритм последовательного чтения представляет из себя: 1. Чтение текущего сектора, определяемого как var2+clust_base+var3*количество_секторов_в_кластере. Или части сектора, тогда надо использовать еще и var1. 2. Проверка на невыход за пределы текущего кластера переменных 1 и 2, если произошел выход, то var3=FAT(var3) и var1=0, var2=0. И опять сначала. Процедура, реализующая получение содержимого таблицы FAT по номеру текущего кластера для FAT16/FAT31 суть всего-лишь чтение одного сектора FAT.
Какие же проблемы? сектор сам по себе 512 байт. надо и себе озу оставить. если там длинные имена - байт 100 под имя. в опчем разве что полсектора читать. соответственно, возрастает сложность кода. и все влезет в 1 Килобайт?
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Jan 27 2009, 08:44
|

embedder
  
Группа: Свой
Сообщений: 264
Регистрация: 11-05-05
Из: Казань
Пользователь №: 4 911

|
Цитата(sonycman @ Jan 27 2009, 11:37)  100 байт под LFN не маловато будет?  А вообще RST7 вёл речь про чтение секторов без поддержки LFN... Вообще топик не про файловую систему, а про STM32 MP3
--------------------
Мечты стареют куда быстрее мечтателей… Стивен Кинг. "Ловец снов"
|
|
|
|
|
Jan 27 2009, 15:21
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(blackfin @ Jan 27 2009, 03:44)  Конечно "маловато".. Нужно 2*260. ну маловато, но идея была - сделать кастрированную читалку ФАТ. Если там всего 512 байт в VLSI - че делать? все - каюк.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Jan 27 2009, 16:49
|

embedder
  
Группа: Свой
Сообщений: 264
Регистрация: 11-05-05
Из: Казань
Пользователь №: 4 911

|
Цитата(A. Fig Lee @ Jan 27 2009, 18:21)  ну маловато, но идея была - сделать кастрированную читалку ФАТ. Если там всего 512 байт в VLSI - че делать?
все - каюк. Для чего длинные имена в mp3 плеере на VLSI? Я думаю чтение ID3 тэгов сделать куда разумнее.
--------------------
Мечты стареют куда быстрее мечтателей… Стивен Кинг. "Ловец снов"
|
|
|
|
|
Jan 27 2009, 17:43
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Если там всего 512 байт в VLSI - че делать? все - каюк. Блин, да курните вы поглубже про внутренности VLSI. Во-первых, там есть еще входная очередь размером в 2К. Пока не играем - она, понятное дело, пуста. Раскладывайте там свои причиндалы для разбора LFN. А когда плей - прямо читайте сектора в очередь да и все. Так уж и быть. Я тут скоро один проектик с этой VLSI буду делать, слеплю вам маленький плейер. Цитата А есть по ним инфа? CODE /*
This is an example program that shows how to extract MP3 ID3v1 tags. It is written in standard ANSI C and can be compiled with any working C compiler.
Usage: "id3tag file1.mp3 [file2.mp3 [...]]"
Author: Henrik Herranen, VLSI Solution, 2000-07-21
*/
#include <stdio.h> #include <stdlib.h> #include <string.h>
/*
Different genres are described below. If it is felt that these take too much space from a microcontroller, the whole list may be thrown away since the genre information is used wrong most of the time anyway.
*/ #define GENRES 148
char *genres[GENRES] = { "Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge", "Hip-Hop", "Jazz", "Metal", "New Age", "Oldies", "Other", "Pop", "R&B", "Rap", "Reggae", "Rock", "Techno", "Industrial", "Alternative", "Ska", "Death Metal", "Pranks", "Soundtrack", "Euro-Techno", "Ambient", "Trip-Hop", "Vocal", "Jazz+Funk", "Fusion", "Trance", "Classical", "Instrumental", "Acid", "House", "Game", "Sound Clip", "Gospel", "Noise", "AlternRock", "Bass", "Soul", "Punk", "Space", "Meditative", "Instrumental Pop", "Instrumental Rock", "Ethnic", "Gothic", "Darkwave", "Techno-Industrial", "Electronic", "Pop-Folk", "Eurodance", "Dream", "Southern Rock", "Comedy", "Cult", "Gangsta", "Top 40", "Christian Rap", "Pop/Funk", "Jungle", "Native American", "Cabaret", "New Wave", "Psychadelic", "Rave", "Showtunes", "Trailer", "Lo-Fi", "Tribal", "Acid Punk", "Acid Jazz", "Polka", "Retro", "Musical", "Rock & Roll", "Hard Rock", "Folk", "Folk/Rock", "National folk", "Swing", "Fast-fusion", "Bebob", "Latin", "Revival", "Celtic", "Bluegrass", "Avantgarde", "Gothic Rock", "Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock", "Big Band", "Chorus", "Easy Listening", "Acoustic", "Humour", "Speech", "Chanson", "Opera", "Chamber Music", "Sonata", "Symphony", "Booty Bass", "Primus", "Porn Groove", "Satire", "Slow Jam", "Club", "Tango", "Samba", "Folklore", "Ballad", "Powder Ballad", "Rhythmic Soul", "Freestyle", "Duet", "Punk Rock", "Drum Solo", "A Capella", "Euro-House", "Dance Hall", "Goa", "Drum & Bass", "Club House", "Hardcore", "Terror", "Indie", "BritPop", "NegerPunk", "Polsk Punk", "Beat", "Christian Gangsta", "Heavy Metal", "Black Metal", "Crossover", "Contemporary C", "Christian Rock", "Merengue", "Salsa", "Thrash Metal", "Anime", "JPop", "SynthPop" };
/*
Here is the main program. The program is called by giving 1 or more MP3 files as command line arguments.
Example: mp3tag mysong.mp3 othersong.mp3
*/
int main(int argc, char **argv) { int i; /* 128 bytes needed for raw ID3 data */ char id3[128];
for (i=1; i<argc; i++) { if (!strcmp(argv[i], "-h")) { printf("Usage: %s file1.mp3 [file2.mp3 [...]]\n", argv[0]); exit(EXIT_SUCCESS); } else { FILE *fp = fopen(argv[i], "rb");
if (!fp) { printf("Couldn't open file %s\n", argv[i]); exit(EXIT_FAILURE); }
/* Read last 128 bytes of the file, if we can */
if (fseek(fp, -128, SEEK_END) || fread(id3, 128, 1, fp) != 1) { printf("Couldn't jump/read in file %s\n", argv[i]); exit(EXIT_FAILURE); } fclose(fp);
/* Now we have read the last 128 bytes and it's time to see if we have some ID3 there or not. A valid ID3 tag has the characters 'T', 'A', and 'G' as its 3 identifying characters. */
if (strncmp(id3, "TAG", 3)) { printf("File \"%s\" doesn't have an ID3 tag\n\n", argv[i]); } else { unsigned char *s = id3+3; char title[31]; char artist[31]; char album[31]; char year[5]; char comment[31]; char genre[31];
/* Id3 tag elements don't necessarily end in a '\0' if they occupy the full 30 character space. Thus, we'll have to nul-terminate all strings just to be sure. */ strncpy(title, s, 30); title[30] = '\0'; s += 30;
strncpy(artist, s, 30); artist[30] = '\0'; s += 30;
strncpy(album, s, 30); album[30] = '\0'; s += 30;
strncpy(year, s, 4); year[4] = '\0'; s += 4;
strncpy(comment, s, 30); comment[30] = '\0'; s += 30;
/* The genre field is not encoded as a string, but just one byte that indexes the decoding table. If memory is too expensive, the whole field may be ignored or just shown as a number. */ if (*s >= GENRES) strcpy(genre, "Unknown"); else strcpy(genre, genres[*s]);
/* And now the final printing */ printf("File \"%s\":\n", argv[i]); printf("Title : %-30s Artist: %s\n", title, artist); printf("Album : %-30s Year : %4s\n", album, year); printf("Comment: %-30s Genre : %s\n\n", comment, genre); } } }
return EXIT_SUCCESS; }
И вообще, горячие финские парни все придумали за нас http://www.vlsi.fi/en/support/evaluationbo...protoboard.html
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jan 27 2009, 18:05
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(zksystem @ Jan 27 2009, 20:49)  Для чего длинные имена в mp3 плеере на VLSI? Я думаю чтение ID3 тэгов сделать куда разумнее. Для плеера LFN нафиг не нужны. Мне для универсального диска на карточке это понадобится. Цитата(sergvks @ Jan 27 2009, 21:55)  А кто-нить пробовал отлаживать проги для vs-ок ? Нормальный отладчик там за бабки, а сидеть в командной строке после того же Кейла как-то ломает. ИМХО для этих целей прямо просится str911fam44 - стоит недорого, памяти и производительности выше крыши для этой задачи, I2S легко реализуется на таймере и ssp. Что, прямо таки девятый арм необходим? А седьмые не подходят?
|
|
|
|
|
Jan 27 2009, 18:11
|
Местный
  
Группа: Свой
Сообщений: 251
Регистрация: 26-07-05
Пользователь №: 7 117

|
Цитата(sonycman @ Jan 27 2009, 21:05)  Что, прямо таки девятый арм необходим? А седьмые не подходят? Так цена почти одинаковая, а запас по памяти и производительности всегда приятно иметь. Сейчас mp3, а завтра flac захочется и т.д. Кстати, требования для Helix MP3 Decoder 320 Kbps: ARM7TDMI - 30 MHz ARM9E - 20 MHz
|
|
|
|
|
Jan 27 2009, 19:22
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(sergvks @ Jan 27 2009, 22:11)  Кстати, требования для Helix MP3 Decoder 320 Kbps: ARM7TDMI - 30 MHz ARM9E - 20 MHz Ну так девятый арм, всё таки. Наверное, декодер DSP инструкции юзает. Кстати, если софтово регулировать громкость - как это в общем происходит? Простым делением не прокатит? Извиняюсь за такие вопросы, но в DSP не шарю
|
|
|
|
|
Jan 27 2009, 19:52
|

embedder
  
Группа: Свой
Сообщений: 264
Регистрация: 11-05-05
Из: Казань
Пользователь №: 4 911

|
Цитата(sonycman @ Jan 27 2009, 22:22)  Ну так девятый арм, всё таки. Наверное, декодер DSP инструкции юзает. Кстати, если софтово регулировать громкость - как это в общем происходит? Простым делением не прокатит? Извиняюсь за такие вопросы, но в DSP не шарю  Громкость лучше регулировать логарифмическими табличками или это при понижении разрядности используется?
Сообщение отредактировал zksystem - Jan 27 2009, 19:54
--------------------
Мечты стареют куда быстрее мечтателей… Стивен Кинг. "Ловец снов"
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|