BASS - piszemy odtwarzacz mp3
Autor: Krzysztof Pawlik (krzysiek.pawlik@people.pl)
WWW: Programmer's Sun (http://ps.nq.pl/)
Zawsze zazdrościłem Linuxowi takiego fajnego programiku jakim jest mpg123 - jest to odtwarzacz MP3 przeznaczony dla konsoli. W tym artykule napiszemy własny odpowiednik mpg123 dla Win32.
Co będzie potrzebne
Po pierwsze sam BASS - dostępny jest za darmo, jeśli swój program także udostępnisz za darmo (nie musi być udostępniony na zasadzie open-source, wystarczą darmowe binaria). BASS dostępny jest na stronie http://www.un4seen.com/music/ (dostępna jest tam wersja 1.5 - wersję 1.4 można także pobrać z działu Download). Mamy więc już plik bass15.zip (najnowsza wersja dostępna na stronie autora) lub bass14l.zip. Musimy teraz utworzyć bibliotekę LIB dla naszego kompilatora, robimy to programem implib:
implib bass.lib bass.dll
Można oczywiście posłużyć się funkcjami LoadLibrary() i GetProcAddress() aby w czasie działania programu wczytywać DLL'a i dynamicznie pobierać adresy funkcji, lecz w tym przypadku stwarza to za dużo problemów - po co zawracać sobie tym głowę skoro można to zrobić prościej i równie dobrze? (nie neguje tego, że dynamiczne wczytywanie DLL'i ma swoje zalety, ale w tym przypadku nie ma sensu). Przydatny będzie także kompilator, notatnik (tudzież inny edytor) i coś dobrego do picia (np. kawa) :))
Zaczynamy
Zaczynamy od dołączenia odpowiednich plików:
|
Unit1.cpp |
|
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include "bass.h"
| |
|
Teraz tworzymy zmienne:
|
Unit1.cpp |
|
HSTREAM hMP3;
DWORD dwStreamLen;
DWORD dwStreamCurrentPos;
float fSeconds;
float fSecondsTotal;
| |
|
hMP3 przechowuje uchwyt naszego strumienia, dwStreamLen przechowuje długość strumienia, dwStreamCurrentPos aktualną pozycję w strumieniu, fSeconds która sekunda jest aktualnie odtwarzana a fSecondsTotal długość pliku w sekundach.
main()
Zainicjowanie BASS'a sprowadza się do wywołania dwóch funkcji:
|
Unit1.cpp |
|
BASS_Init(-1, 22050, 0, 0);
BASS_Start();
| |
|
BASS_Init() inicjuje BASS'a, parametry
pierwszy to urządzenie z którego BASS będzie korzystał przy odtwarzaniu dźwięku (-1 oznacza urządzenie domyślne)
drugi parametr to częstotliwość wyjścia (jeśli odtwarzany dźwięki będzie zapisany w np. 44100 to nastąpi jego konwersja do 22050)
trzeci parametr to flagi - w naszym przypadku nie precyzujemy nic więcej
ostatni parametr to HWND (uchwyt) okna naszego programu, jeśli podamy 0 to zostanie pobrany uchwyt aktywnego okna
BASS_Start() włącza mikser i jednocześnie umożliwia odtwarzanie. Dopiero po wywołaniu tych funkcji możemy przejść do utworzenia strumienia i właściwego odtwarzania.
Strumień tworzymy funkcją BASS_StreamCreateFile():
|
Unit1.cpp |
|
hMP3 = BASS_StreamCreateFile(false, argv[1], 0, 0, BASS_MP3_SETPOS);
| |
|
Ważny dla nas jest drugi parametr: podajemy w nim nazwę pliku. Jeśli hMP3 jest różne od zera to udało się utworzyć strumień.
Pobieramy także długość strumienia i przeliczamy go na sekundy:
|
Unit1.cpp |
|
dwStreamLen = BASS_StreamGetLength(hMP3);
fSecondsTotal = BASS_ChannelBytes2Seconds(hMP3, dwStreamLen);
| |
|
Funkcje nie wymagają komentarza - ich nazwy mówią wszystko :)
Teraz wystarczy użyć jednej funkcji, aby było słychać dźwięk:
Pierwszy parametr to uchwyt naszego strumienia, drugi to wartość true lub false - czy chcemy aby strumień był odtwarzany bezprzerwy, ostatni parametr to flagi.
Ponieważ BASS działa w osobnym wątku wykonywanie naszego programu skończyło by się zanim cały dźwięk został odtworzony, musimy więc użyć jakiejś pętli, np takiej:
|
Unit1.cpp |
|
do {
dwStreamCurrentPos = BASS_ChannelGetPosition(hMP3);
fSeconds = BASS_ChannelBytes2Seconds(hMP3, dwStreamCurrentPos);
printf("\rSeconds: %3.0f/%3.0f ", fSeconds, fSecondsTotal);
Sleep(10);
} while (dwStreamCurrentPos != dwStreamLen && !kbhit());
| |
|
Pętla ta oczekuje na naciśnięcie klawisza, lub aż aktualna pozycja odtwarzania będzie równa długości pliku. Przy okazji wyświetla, która sekunda właśnie jest odtwarzana.
Program należy zakończyć zwolnieniem zasobów BASS'a:
Gotowy program: art_mp3p.zip (663 bajty)
| Wasze opinie: |
| Średnia ocena: 4.17/10 (24 głosów) |
|
| Liczba komentarzy: 9 (pokaż wszystkie) | Skomentuj !
|
| Autor: Ya | Data dodania: 2007-12-30 |
| Mi to strasznie ubogo wyglada...
nie odpalalem go ale wydaje mi sie ze to odtwarzacz mp3 do trybu
tekstowego |
| Autor: Artur | Data dodania: 2007-12-26 |
| trzeba jeszcze umiec się posługiwać jakimś kompilatorem :/ |
| Autor: Maks | Data dodania: 2007-02-17 |
| Co to jest? i jak napisze plik to co mam zrobic? GŁUPOTA NA MAX'A!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
| Autor: SebaS86 | Data dodania: 2005-08-16 |
| W obecnych czasach zawsze lepiej skorzystać z gotowej biblioteki (a nie gotowego programu jak to pewien "pan" wyżej napisał). No chyba, że ktoś umie zdekodować format mp3, obsłużyć karte muzyczną, wątki, itd. |
| Autor: Abloy | Data dodania: 2005-06-07 |
| Yo Krzysiek, świetny artyqł! Krótko, treściwie i trafnie ;b. Popraw tylko znaki '&' na '<' w includach, no i chyba zapomniałeś wstawić BASS_StreamPlay(...). Pozdrowienia |
| Autor: Abloy | Data dodania: 2005-06-07 |
| Yo Krzysiek, świetny artyqł! Krótko, treściwie i trafnie ;b. Popraw tylko znaki '&' na '<' w includach, no i chyba zapomniałeś wstawić BASS_StreamPlay(...). Pozdrowienia |
| Autor: Renegat | Data dodania: 2005-03-07 |
| Eeee to to nie będzie działać bez innego programu?
Po co pisać program który będzie czerpał z innego programu?
Nie można zrobić -=autonomicznego=- programu który będzie odtwarzał? |
|
|