Zugriff auf die Soundkarte mit C

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
cumi
Beiträge: 39
Registriert: 29.05.2005 14:18:55

Zugriff auf die Soundkarte mit C

Beitrag von cumi » 26.02.2006 14:40:44

Hallo Zusammen

Ich bin gleich enwenig ab C programmieren. Ich kompiliere meine Programme natürlich miti dem gcc.

Ich möchte nun gerne auf der Soundkarte möglichst einfach einen Sinus-Ton mit einer bestimmen Frequenz ausgeben.

Kennt jemand eine Anleitung, wie das geht?

Vielen Dank für eure Hilfe!
cumi

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 26.02.2006 15:07:59

Ganz alter Code, nutzt noch OSS.

Schau dir mal das modernere ALSA API an, z.B. hier: http://equalarea.com/paul/alsa-audio.html

Code: Alles auswählen

#include <linux/soundcard.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdarg.h>
#include <math.h>

#ifndef M_PI
#define M_PI 3.141592653589793
#endif


int main()
{
    int sd;

    int fmt=AFMT_S16_LE;
    int rate=22050;
    int stereo=0;
    int i;

    static signed short buffer[22050];
    
    sd = open("/dev/dsp", O_WRONLY);
    if (!sd)
	perror("Unable to open /dev/dsp!");
    if (ioctl(sd, SNDCTL_DSP_RESET)<0) 
	perror("Unable to reset dsp");
    if (ioctl(sd, SNDCTL_DSP_SPEED, &rate)<0)
	perror("Unable to set rate");
    if (ioctl(sd, SNDCTL_DSP_STEREO, &stereo)<0)
	perror("unable to set stereo");
    if (ioctl(sd, SNDCTL_DSP_SETFMT, &fmt)<0)
	perror("unable to set format");

    for(i=0;i<22050;i++) {
	buffer[i] = 32767*sin(i/22050.*M_PI*440       );
    }
    
    write(sd, buffer, sizeof(buffer));
    close(sd);
    return 0;
}
(compilieren mit gcc Programm.c -lm -oAusgabedateiname)

cumi
Beiträge: 39
Registriert: 29.05.2005 14:18:55

Beitrag von cumi » 26.02.2006 22:00:56

danke vielmals. isch schau das einmal an....

Antworten