Sound unter Linux ausgeben
-
Hallo Linux-freunde,
ich möchte eine sound-Datei unter Linux ausgeben (mit einem C++ - Programm). Das file ist bereits erfolgreich eigelesen worden und liegt intern in einem Feld von "short int"-Werten vor. Die weiteren Parameter sind: mono, 16-bit, 16000 hz Abtastfrequenz.
Ich habe die entsprechenden .h-Dateien eingebunden (soundcard.h, ioctl.h) und mit
sound_dev=open("/dev/dsp", ORDWR); ... error = ioctl(sound_dev, SOUND_PCM_WRITE_BITS, &sample_size); ... error = ioctl(sound_dev, SOUND_PCM_WRITE_CHANNELS, &channels); ... error = ioctl(sound_dev, SOUND_PCM_WRITE_RATE, &sample_size);
die entsprechenden Einstellungen gesetzt. Nun kam mir die Idee, die Daten einfach in ein Array buffer zu schreiben und anschließend in das sound_dev auszugeben.
short int buffer[my_size]; ... error = write (sound_dev,buffer,sizeof(buffer));
Die Daten werden jetzt zwar abgespielt *freu*, aber in einer viel zu hohen geschwindigkeit ... Kann mir jemand sagen, was ich falsch gemacht habe? Hätte der buffer einen anderen Typ haben müssen (welchen,wie die Daten umrechnen).
Danke für jeden Hinweis!
-
Das Format der Sound-Daten, die du an /dev/dsp schickst, stellt man normalerweise über die ioctl()-Aufrufe
SNDCTL_DSP_SETFMT
SNDCTL_DSP_STEREO
SNDCTL_DSP_SPEEDein. Beispiel aus meinem Buch "C und Linux":
/* rec_play.c - Audio-Signal aufnehmen u. wiedergeben */ # include <stdio.h> # include <unistd.h> # include <fcntl.h> # include <sys/ioctl.h> # include <linux/soundcard.h> # define NUM_SAMPLES 100000 unsigned char buffer[NUM_SAMPLES]; int main() { int fd, i, format=AFMT_U8; long length; char input[16]; if ((fd = open("/dev/dsp", O_RDWR)) == -1) { perror("rec_play: Can't open device"); return(1); } if (ioctl(fd, SNDCTL_DSP_SETFMT, &format) == -1) perror("rec_play: Can't set format"); i = 0; if (ioctl(fd, SNDCTL_DSP_STEREO, &i) == -1) perror("rec_play: Can't set to mono"); i = 22050; if (ioctl(fd, SNDCTL_DSP_SPEED, &i) == -1) perror("rec_play: Can't set sampling rate"); printf("Press <RETURN> to start recording. "); fgets(input, 16, stdin); if ((length = read(fd, buffer, NUM_SAMPLES)) == -1) { perror("rec_play: Can't record audio data"); return(1); } printf("done (%ld bytes).\n" "Press <RETURN> to start playing. ", length); fgets(input, 16, stdin); if (write(fd, buffer, length) == -1) perror("rec_play: Can't play audio data"); close(fd); return(0); }
Martin