Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // Laboratorium IwSK 2
- //
- // Temat: Linux - Simple DirectMedia Layer (SDL) + sound
- // Data: 2 marca 2015
- // Skład podsekcji: Michał Sitarz, Szymon Bartnik, Kamil Steuer, Bartłomiej Szostek
- // Opis programu:
- // Za zadanie mieliśmy zrobić prosty program, odtwarzający pliki wave.
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/ioctl.h>
- #include <fcntl.h>
- #include <string.h>
- #include <sys/stat.h>
- #include <unistd.h>
- #include <sys/soundcard.h>
- #include <SDL/SDL.h>
- #include <SDL/SDL_sound.h>
- unsigned long long position; // bieżąca pozycja w buforze pliku
- int exitFlag; // flaga, sprawdzająca czy odczytaliśmy ostatni fragment bufora plikowego
- // przekopiowuje kolejne fragmenty z bufora plikowego do sprzętowego bufora odtwarzającego
- void process(void *userdata, Uint8 *stream, int len)
- {
- // wskażnik na bufor plikowy z dźwiękiem
- void *ptr = ((Sound_Sample *)userdata)->buffer;
- // jeśli wykryliśmy odczytanie ostatniego fragmentu bufora plikowego,
- // ustawienie flagi wyjścia po tym fragmencie i zmniejszenie rozmiaru
- // fragmentu do odczytania (aktualizacja zmiennej len)
- if (position + len >= ((Sound_Sample *)userdata)->buffer_size) {
- exitFlag = 1;
- len = ((Sound_Sample *)userdata)->buffer_size - position;
- }
- ptr += position;
- memcpy(stream, ptr, len); // kopiowanie
- position += len; // uaktualnienie bieżącej pozycji bufora
- }
- int main(int argc, char* argv[])
- {
- Sound_Sample *sound_sample;
- SDL_AudioSpec *audio_spec;
- struct stat buf; // struktura do której zapisujemy informacje o odczytanym pliku
- char* filename; // nazwa pliku dźwiękowego
- position = 0;
- exitFlag = 0;
- // odczyt parametrów wejściowych
- if(argc == 2) {
- filename = argv[1];
- } else {
- return 1;
- }
- // alokacja pamięci na bufor
- audio_spec = (SDL_AudioSpec *)malloc(sizeof(SDL_AudioSpec));
- stat(filename, &buf); // pobranie informacji o pliku do odtwarzania
- SDL_Init(SDL_INIT_AUDIO); // inicjalizacja systemu SDL z flagą wskazującą, że zajmujemy się dźwiękiem
- Sound_Init(); // inicjalizacja systemu SDL_Sound
- // załadowanie informacji o dźwięku z pliku do pamięci
- sound_sample = Sound_NewSampleFromFile(filename, NULL, buf.st_size);
- Sound_DecodeAll(sound_sample); // zdekodowanie załadowanych danych dźwiękowych
- // sprawdzenie, czy udało się zdekodować dane poprawnie
- if (sound_sample->flags & SOUND_SAMPLEFLAG_ERROR) {
- return 1;
- }
- // wypełnienie struktury z parametrami urządzenia audio
- audio_spec->freq = sound_sample->actual.rate;
- audio_spec->format = sound_sample->actual.format;
- audio_spec->channels = sound_sample->actual.channels;
- audio_spec->samples = 64;
- audio_spec->userdata = sound_sample;
- audio_spec->callback = &process;
- audio_spec->silence = audio_spec->padding = audio_spec->size = 0;
- SDL_OpenAudio(audio_spec, NULL); // otwarcie urządzenia audio z zadanymi parametrami
- SDL_PauseAudio(0); // rozpoczęcie odtwarzania
- while (!exitFlag) {
- SDL_Delay(150);
- }
- SDL_CloseAudio(); // zamknięcie urządzenia audio
- Sound_FreeSample(sound_sample); // zwolnienie pamięci zawierającej próbki dźwiękowe
- free(audio_spec); // zwolnienie pamięci
- Sound_Quit(); // zamknięcie systemu SDL_Sound
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement