Responsabili:
Dobre, băiat excentric și student la medicină, dorește ca petrecerea de ziua lui din acest an să fie una memorabilă. Pentru a avea o petrecere flamboaiantă, el își roagă fratele, Gogo, proaspăt inginer in calculatoare să îi creeze un player muzical special pentru această ocazie.
Deoarece Gogo este ocupat cu munca, dar este și un tip responsabil, nu vrea să îl dezamăgească pe Dobre, se apucă să caute informații despre fișierele MP3:
ID3 este un container de metadate cel mai des utilizat în combinație cu formatul de fișiere audio MP3. Acesta permite ca informații (titlul, artistul, albumul, numărul piesei, genul, etc.) despre fișier să fie stocate chiar în interiorul fișierului. Containerul ID3v1 ocupă 128 de bytes, începând cu șirul TAG și este situat la șfârșitul fișierului pentru a menține compatibilitatea cu media playere mai vechi. Câmpurile containerului ID3v1 sunt:
Câmp | Lungime | Descriere |
---|---|---|
antet | 3 | “TAG” |
titlu | 30 | 30 de caractere pentru titlu |
artist | 30 | 30 de caractere pentru numele artistului |
album | 30 | 30 de caractere pentru numele albumului |
an | 4 | 4 cifre pentru anul apariției |
comentariu | 28[3] 30 | maxim 30 de caractere pentru comentariu |
zero-byte[3] | 1 | dacă numărul de pistă e stocat acest octet va conține un 0 binar |
piesă[3] | 1 | numărul piesei de pe album sau 0; invalid dacă octetul anterior nu este un 0 binar |
gen | 1 | indice într-o listă de genuri sau 255 |
[3]. Numărul piesei este stocat în ultimii doi octeți din câmpul de comentariu. Dacă comentariul este de 29 sau 30 de caractere, numarul de pistă nu poate fi stocat.
Ajută-l pe Gogo să se asigure că termină playerul muzical la timp prin implementarea unei structuri de date care să gestioneze lista de melodii a playerului. Media playerul poate fi implementat folosind o listă dublu înlănțuită, căreia îi atașăm un nod auxiliar cursor care pointează către melodia curentă în redare, conform figurii următoare:
Pe prima linie se va afla un număr q, reprezentând numărul de comenzi care se vor efectua asupra playerului muzical. Pe următoarele q linii se pot afla următoarele tipuri de comenzi:
Formatul de afișare pentru informațiile melodiilor este:
"Title: <titlu melodie>\n" "Artist: <artist melodie>\n" "Album: <album melodie>\n" "Year: <an melodie>\n"
Formatul de afișare pentru playlist este:
"[<titlu melodie_1>; <titlu melodie_2>; … <titlu melodie_n>]\n"
Comenzile se vor citi din fișierul <media.in> și outputul se va afișa în fișierul <media.out>. Numele fișierelor de in/out se vor da ca parametri în linie de comandă. Pentru simplitate, am ales ca în această temă, containerul cu metadate să conțină doar: TAG, titlu, artist, albumul și anul apariției (97 bytes în loc de 128 bytes cum sunt în standardul ID3). Tot pentru a simplifica lucrul cu fișierele .mp3 “melodiile” folosite în tema vor fi fișiere generate care se vor găsi în directorul “songs” din arhiva de testare. O “melodie” din directorul “songs” va avea următoarea structură:
* secțiunea de garbage reprezintă bytes care ar fi folosiți pentru a stoca efectiv melodia
Fișierul <media.out> va conține atât informațiile care au fost cerute, cât și erorile comenzilor când acestea nu au putut fi executate, în ordinea primirii lor din fișierul de intrare.
media.in:
10
DEL_FIRST
ADD_LAST Metallica - Battery.mp3
ADD_FIRST Gorillaz - Feel Good Inc.mp3
ADD_AFTER NOMA - Brain power.mp3
SHOW_CURR
MOVE_NEXT
DEL_LAST
MOVE_PREV
SHOW_CURR
SHOW_PLAYLIST
media.out:
Error: delete from empty playlist
Title: Battery
Artist: Metallica
Album: Master Of Puppets
Year: 1985
Title: Feel Good Inc
Artist: Gorillaz
Album: Feel Good Inc
Year: 2005
[Feel Good Inc; Battery]
Teste locale: checker-tema1-2020.zip
Temele vor fi trimise pe vmchecker. Atenție! Temele trebuie trimise în secțiunea Structuri de Date (CA).
Arhiva trebuie să conțină:
De aceea, vă sfătuim să nu vă lăsați rezolvări ale temelor pe calculatoare partajate (la laborator etc), pe mail/liste de discuții/grupuri etc.
Q: Se pot folosi flag-uri de optimizare?
A: Nu aveți voie să folosiți flag-uri de optimizare în Makefile (-O3, -O2, etc.).