MOJA PASJA - PROGRAMOWANIE
   Dzisiaj jest Czwartek, 24 lipca, 2008r. Ostatnia aktualzacja miała miejsce: 10 grudnia 2006r. Homepage

Programowanie: Artykuły * FAQ * Download * Komponenty * Książki WWW: Artykuły * Narzędzia * Kursy * Darmowe * FAQ * Skrypty * Ksiązki Off-Topic: Aforyzmy * Humor Inne: Forum * Wiki * Liczniki * Linki * Chat * Grafika * Video * Inne



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:

       Unit1.cpp

      BASS_Free();



       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: YaData dodania: 2007-12-30
    Mi to strasznie ubogo wyglada... nie odpalalem go ale wydaje mi sie ze to odtwarzacz mp3 do trybu tekstowego


    Autor: ArturData dodania: 2007-12-26
    trzeba jeszcze umiec się posługiwać jakimś kompilatorem :/


    Autor: MaksData dodania: 2007-02-17
    Co to jest? i jak napisze plik to co mam zrobic? GŁUPOTA NA MAX'A!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


    Autor: SebaS86Data 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: AbloyData 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: AbloyData 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: RenegatData 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ł?



  • Stronę przygotował: Kacper Cieśla (comboy). Wszelkie prawa zastrzeżone.
    Reklama * Zgłoś błąd * Kontakt * Hosting * O stronie * Sponsoring
    Czas generowania strony: 1.177s