alsa_copy.c

/*
 * plik ma na celu prezentację ciekawych zagadnień z programowania w języku C / C++
 * prezentuje korzystanie z bliblioteki dźwiękowej ALSA (odczyt i zapis dźwięku do użądzenia)
 *
 * kompilacja: gcc -lasound alsa_copy.c
 *
 * praktycznym wykorzystaniem tego programu jest implementacja pętli pomiędzy
 * wejściem liniowym a wyjściem głośnikowym w karcie dźwiękowej opartej o ICH6 + CMI9880
 *
 * jest to program który może zastąpić dsp.c gdy nie chcemy używać arts do miksowania dźwięku
 * a też nie chcemy zajmować /dev/dsp (co ma miejsce gdy tamten program pisze zamiast
 * do arts do tego użądzenia) gdyż mikser programowy systemu ALSA (dmix) nie obsługuje
 * miksowania z /dev/dsp tworzonego przez snd_pcm_oss (aby korzystać z programów wymagających
 * OSS poprzez dmix nalezy uzywać ich z aoss oraz umieścić stosowny wpis w /etc/asound.conf
 * dotyczący miksowania użądzenia dsp, alternatywną droga jest korzystanie z serwera dźwięku JACK)
 *
 * o dmix'ie - http://alsa.opensrc.org/DmixPlugin
 * o API asoundlib - http://www.alsa-project.org/alsa-doc/alsa-lib/
 *
 */

#include <alsa/asoundlib.h>

static char *alsa_device = "default";
snd_pcm_t *h_in;
snd_pcm_t *h_out;
unsigned short buf[16*512];

int err;

int main(void) {
  // otwarcie urzadzenia
  err = snd_pcm_open(&h_in, alsa_device, SND_PCM_STREAM_CAPTURE, 0);
  if (err < 0) {
    printf("ERROR (1a): %s\n", snd_strerror(err));
    exit(EXIT_FAILURE);
  }
  
  err = snd_pcm_open(&h_out, alsa_device, SND_PCM_STREAM_PLAYBACK, 0);
  if (err < 0) {
    printf("ERROR (1b): %s\n", snd_strerror(err));
    exit(EXIT_FAILURE);
  }
  
  
  // ustawienie parametrow urzadzenia
  err = snd_pcm_set_params(h_in, SND_PCM_FORMAT_U16, SND_PCM_ACCESS_RW_INTERLEAVED, 1, 16000, 1, 800000);
  if (err < 0) {
    printf("ERROR (2a): %s\n", snd_strerror(err));
    exit(EXIT_FAILURE);
  }
  
  err = snd_pcm_set_params(h_out, SND_PCM_FORMAT_U16, SND_PCM_ACCESS_RW_INTERLEAVED, 1, 16000, 1, 800000);
  if (err < 0) {
    printf("ERROR (2b): %s\n", snd_strerror(err));
    exit(EXIT_FAILURE);
  }
  
  // pętla kopiująca
  while(1) {
    err = snd_pcm_readi (h_in, buf, 8*512);
    if (err == -EPIPE) {
      puts("ERROR (3a): snd_pcm_prepare\n");
      // zapobiega wywalaniu się programu na błędach odczytu z urządzenia
      snd_pcm_prepare(h_in);
    } else if (err < 0) {
      printf("ERROR (3a): %s\n", snd_strerror(err));
    }
    
    err = snd_pcm_writei(h_out, buf, err);
    if (err < 0) {
      err = snd_pcm_recover(h_out, err, 0);
    }
    if (err < 0) {
      printf("ERROR (3b): %s\n", snd_strerror(err));
      break;
    }
  }
  
  snd_pcm_close(h_in);
  snd_pcm_close(h_out);
}

XHTML generated by highlight (http://www.andre-simon.de/) from alsa_copy.c



Copyright (c) 1999-2015, Robert Paciorek (http://www.opcode.eu.org/), BSD/MIT-type license


Redystrybucja wersji źródłowych i wynikowych, po lub bez dokonywania modyfikacji JEST DOZWOLONA, pod warunkiem zachowania niniejszej informacji o prawach autorskich. Autor NIE ponosi JAKIEJKOLWIEK odpowiedzialności za skutki użytkowania tego dokumentu/programu oraz za wykorzystanie zawartych tu informacji.

This text/program is free document/software. Redistribution and use in source and binary forms, with or without modification, ARE PERMITTED provided save this copyright notice. This document/program is distributed WITHOUT any warranty, use at YOUR own risk.

Valid XHTML 1.1 Dokument ten (URL: http://www.opcode.eu.org/programing/c_cpp/alsa_copy.c) należy do serwisu OpCode. Autorem tej strony jest Robert Paciorek, wszelkie uwagi proszę kierować na adres e-mail serwisu: webmaster@opcode.eu.org.
Data ostatniej modyfikacji artykulu: '2014-01-07 19:27:41 (UTC)' (data ta może być zafałszowana niemerytorycznymi modyfikacjami artykułu).