Advertisement
kneefer

Iwsk_lab2

Mar 2nd, 2015
336
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.26 KB | None | 0 0
  1. //
  2. // Laboratorium IwSK 2
  3. //
  4. // Temat: Linux - Simple DirectMedia Layer (SDL) + sound
  5. // Data: 2 marca 2015
  6. // Skład podsekcji: Michał Sitarz, Szymon Bartnik, Kamil Steuer, Bartłomiej Szostek
  7.  
  8. // Opis programu:
  9. // Za zadanie mieliśmy zrobić prosty program, odtwarzający pliki wave.
  10.  
  11. #include  <stdio.h>
  12. #include <stdlib.h>
  13. #include <sys/ioctl.h>
  14. #include <fcntl.h>
  15. #include <string.h>
  16. #include <sys/stat.h>
  17. #include <unistd.h>
  18. #include <sys/soundcard.h>
  19. #include <SDL/SDL.h>
  20. #include <SDL/SDL_sound.h>
  21.  
  22. unsigned long long position; // bieżąca pozycja w buforze pliku
  23. int exitFlag;                // flaga, sprawdzająca czy odczytaliśmy ostatni fragment bufora plikowego
  24.  
  25. // przekopiowuje kolejne fragmenty z bufora plikowego do sprzętowego bufora odtwarzającego
  26. void process(void *userdata, Uint8 *stream, int len)
  27. {
  28.     // wskażnik na bufor plikowy z dźwiękiem
  29.     void *ptr = ((Sound_Sample *)userdata)->buffer;
  30.  
  31.     // jeśli wykryliśmy odczytanie ostatniego fragmentu bufora plikowego,
  32.     // ustawienie flagi wyjścia po tym fragmencie i zmniejszenie rozmiaru
  33.     // fragmentu do odczytania (aktualizacja zmiennej len)
  34.     if (position + len >= ((Sound_Sample *)userdata)->buffer_size) {
  35.         exitFlag = 1;
  36.         len = ((Sound_Sample *)userdata)->buffer_size - position;
  37.     }
  38.     ptr += position;
  39.    
  40.     memcpy(stream, ptr, len); // kopiowanie
  41.     position += len; // uaktualnienie bieżącej pozycji bufora
  42. }
  43.  
  44.  
  45. int main(int argc, char* argv[])
  46. {
  47.     Sound_Sample *sound_sample;
  48.     SDL_AudioSpec *audio_spec;
  49.     struct stat buf; // struktura do której zapisujemy informacje o odczytanym pliku
  50.     char* filename; // nazwa pliku dźwiękowego
  51.    
  52.     position = 0;
  53.     exitFlag = 0;
  54.    
  55.     // odczyt parametrów wejściowych
  56.     if(argc == 2) {
  57.         filename = argv[1];
  58.     } else {
  59.         return 1;
  60.     }
  61.    
  62.     // alokacja pamięci na bufor
  63.     audio_spec = (SDL_AudioSpec *)malloc(sizeof(SDL_AudioSpec));
  64.  
  65.     stat(filename, &buf); // pobranie informacji o pliku do odtwarzania
  66.  
  67.     SDL_Init(SDL_INIT_AUDIO); // inicjalizacja systemu SDL z flagą wskazującą, że zajmujemy się dźwiękiem
  68.  
  69.     Sound_Init(); // inicjalizacja systemu SDL_Sound
  70.  
  71.     // załadowanie informacji o dźwięku z pliku do pamięci
  72.     sound_sample = Sound_NewSampleFromFile(filename, NULL, buf.st_size);
  73.    
  74.     Sound_DecodeAll(sound_sample); // zdekodowanie załadowanych danych dźwiękowych
  75.    
  76.     // sprawdzenie, czy udało się zdekodować dane poprawnie
  77.     if (sound_sample->flags & SOUND_SAMPLEFLAG_ERROR) {
  78.         return 1;
  79.     }
  80.    
  81.     // wypełnienie struktury z parametrami urządzenia audio
  82.     audio_spec->freq = sound_sample->actual.rate;
  83.     audio_spec->format = sound_sample->actual.format;
  84.     audio_spec->channels = sound_sample->actual.channels;
  85.     audio_spec->samples = 64;
  86.     audio_spec->userdata = sound_sample;
  87.     audio_spec->callback = &process;
  88.     audio_spec->silence = audio_spec->padding = audio_spec->size = 0;
  89.    
  90.     SDL_OpenAudio(audio_spec, NULL); // otwarcie urządzenia audio z zadanymi parametrami
  91.     SDL_PauseAudio(0); // rozpoczęcie odtwarzania
  92.  
  93.     while (!exitFlag) {
  94.         SDL_Delay(150);
  95.     }
  96.  
  97.     SDL_CloseAudio(); // zamknięcie urządzenia audio
  98.  
  99.    
  100.     Sound_FreeSample(sound_sample); // zwolnienie pamięci zawierającej próbki dźwiękowe
  101.     free(audio_spec); // zwolnienie pamięci
  102.  
  103.     Sound_Quit(); // zamknięcie systemu SDL_Sound
  104.  
  105.     return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement