hirnfrei
28.06.2016, 11:42
Mahlzeit!
Ich muss um Hilfe rufen. Google, mein Freund, will da einfach keine passende Antwort finden.
So es geht um folgendes. Ich brauche ein Audiosignal. Das an sich wäre weniger das Problem. Mein Code, um das Signal von einer Soundkarte mit Alsa abzurufen und auch wieder auszugeben sehen so aus:
void audioAufzeichnung(double *input, int max, string name, unsigned int channels, unsigned int actualRate, unsigned short inputBits)
{
int i=0;
double *puffer;
puffer = (double *) malloc(1);
if(InitCapture(name, channels, actualRate, inputBits))
{
while(i < max)
{
snd_pcm_readi(soundKarte, puffer, 1);
input[i] = puffer[0];
i++;
}
free(puffer);
UnInit();
}
}
void playAufzeichnung(double *array, unsigned int inputSize, string name, unsigned int channels, unsigned int actualRate, unsigned short inputBits)
{
uint8_t *puffer;
register snd_pcm_uframes_t count, frames;
Init(name, channels, actualRate, inputBits);
puffer = (uint8_t *) malloc(inputSize);
for(int32_t i=0;i<inputSize;i++) puffer[i] = array[i];
inputSize = inputSize * 8 / inputBits * channels;
count = 0;
do
{
frames = snd_pcm_writei(soundKarte, puffer + count, inputSize - count);
if(frames < 0) frames = snd_pcm_recover(soundKarte, frames, 0);
if(frames < 0)
{
break;
}
count += frames;
} while(count < inputSize);
if(count == inputSize) snd_pcm_drain(soundKarte);
UnInit();
}
Mein Problem ist folgendes. Benutze ich diesen Code und nehme anstatt double int32_t funktioniert es. Nun habe ich ja aber hier im Forum und auch sonst im Netz immer wieder gelesen, man solle doch für Audiodaten double nehmen. Das mag mit dem Einlesen der Daten von der Soundkarte noch funktionieren. Will ich es jedoch wieder ausgeben kommt dann nur ein tiefes Brummen.
Nun würde ich den Schuldigen auf
uint8_t *puffer;
..
puffer = (uint8_t *) malloc(inputSize);
for(int32_t i=0;i<inputSize;i++) puffer[i] = array[i];
schieben. Jedoch waren alle Versuche snd_pcm_writei() mit etwas Anderem wie mit einem char, bzw uint8_t Array zu füttern äusserst Schmerzhaft für die Ohren. Das gibt immer einen brutal hohen Piepton.
Kann mir da jemand helfen?
- - - Aktualisiert - - -
Lol okay, hab gerade gesehen das ich doch nur int16 brauche. Das kriege ich dann wieder hin ^^.
Das mit Double würde mich dann doch interessieren.
Ich muss um Hilfe rufen. Google, mein Freund, will da einfach keine passende Antwort finden.
So es geht um folgendes. Ich brauche ein Audiosignal. Das an sich wäre weniger das Problem. Mein Code, um das Signal von einer Soundkarte mit Alsa abzurufen und auch wieder auszugeben sehen so aus:
void audioAufzeichnung(double *input, int max, string name, unsigned int channels, unsigned int actualRate, unsigned short inputBits)
{
int i=0;
double *puffer;
puffer = (double *) malloc(1);
if(InitCapture(name, channels, actualRate, inputBits))
{
while(i < max)
{
snd_pcm_readi(soundKarte, puffer, 1);
input[i] = puffer[0];
i++;
}
free(puffer);
UnInit();
}
}
void playAufzeichnung(double *array, unsigned int inputSize, string name, unsigned int channels, unsigned int actualRate, unsigned short inputBits)
{
uint8_t *puffer;
register snd_pcm_uframes_t count, frames;
Init(name, channels, actualRate, inputBits);
puffer = (uint8_t *) malloc(inputSize);
for(int32_t i=0;i<inputSize;i++) puffer[i] = array[i];
inputSize = inputSize * 8 / inputBits * channels;
count = 0;
do
{
frames = snd_pcm_writei(soundKarte, puffer + count, inputSize - count);
if(frames < 0) frames = snd_pcm_recover(soundKarte, frames, 0);
if(frames < 0)
{
break;
}
count += frames;
} while(count < inputSize);
if(count == inputSize) snd_pcm_drain(soundKarte);
UnInit();
}
Mein Problem ist folgendes. Benutze ich diesen Code und nehme anstatt double int32_t funktioniert es. Nun habe ich ja aber hier im Forum und auch sonst im Netz immer wieder gelesen, man solle doch für Audiodaten double nehmen. Das mag mit dem Einlesen der Daten von der Soundkarte noch funktionieren. Will ich es jedoch wieder ausgeben kommt dann nur ein tiefes Brummen.
Nun würde ich den Schuldigen auf
uint8_t *puffer;
..
puffer = (uint8_t *) malloc(inputSize);
for(int32_t i=0;i<inputSize;i++) puffer[i] = array[i];
schieben. Jedoch waren alle Versuche snd_pcm_writei() mit etwas Anderem wie mit einem char, bzw uint8_t Array zu füttern äusserst Schmerzhaft für die Ohren. Das gibt immer einen brutal hohen Piepton.
Kann mir da jemand helfen?
- - - Aktualisiert - - -
Lol okay, hab gerade gesehen das ich doch nur int16 brauche. Das kriege ich dann wieder hin ^^.
Das mit Double würde mich dann doch interessieren.