Почему не работает простой код, созданный из API импульсного звука?

Я использовал простой C-код импульсного звука для воспроизведения и записи, и он работал нормально. Но когда я преобразовал его в C ++, он не работает. Я вставляю оба кода. Пожалуйста помоги. Код C ++ не показывает никаких ошибок, но не воспроизводит звук. Но код C ++ воспроизводит записанный звук.
Н.Б .: Я использую 64-битную CentOS 6.2

Код C ++:

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <stdint.h>

#include "pulse/simple.h"#include "pulse/error.h"using namespace std;
#define BUFSIZE 32
int error;

/* The Sample format to use */class AudioCapt
{

public:
AudioCapt();
void RecordSound(int argc,char *argv[],pa_simple *s_in,pa_sample_spec &ss,pa_simple *s_out,uint8_t buf[],ssize_t r);
void PlaybackSound(int argc, char*argv[],pa_simple *s_out,pa_sample_spec &ss,uint8_t buf[],ssize_t r);
};void AudioCapt::RecordSound(int argc, char*argv[],pa_simple *s_in,pa_sample_spec &ss,pa_simple *s_out,uint8_t buf[],ssize_t r)
{

printf("Audio Capturing \n");
if (!(s_in = pa_simple_new(NULL, argv[0], PA_STREAM_RECORD, NULL, "record", &ss, NULL, NULL, &error))) {
fprintf(stderr, __FILE__": pa_simple_new() failed: %s\n", pa_strerror(error));
}

if (pa_simple_read(s_in, buf, sizeof(buf), &error) < 0) {
fprintf(stderr, __FILE__": read() failed: %s\n", strerror(errno));
}
printf("Buffer :::: %d\n",buf[0]);

}

void AudioCapt::PlaybackSound(int argc, char*argv[],pa_simple *s_out,pa_sample_spec &ss,uint8_t buf[],ssize_t r)
{
printf("Audio PlayBack \n");
printf("Play Buffer::: %d\n",buf[0]);
if (!(s_out = pa_simple_new(NULL, argv[0], PA_STREAM_PLAYBACK, NULL, "playback", &ss, NULL, NULL,  &error))) {
fprintf(stderr, __FILE__": pa_simple_new() failed: %s\n", pa_strerror(error));
}

/* ... and play it (Modified) */
if (pa_simple_write(s_out, buf, sizeof(buf), &error) < 0) {
fprintf(stderr, __FILE__": pa_simple_write() failed: %s\n", pa_strerror(error));
}

/* Make sure that every single sample was played */
if (pa_simple_drain(s_out, &error) < 0) {
fprintf(stderr, __FILE__": pa_simple_drain() failed: %s\n", pa_strerror(error));
}
}

int main(int argc, char * argv[])
{

pa_sample_spec ss;
ss.format = PA_SAMPLE_S16LE;
ss.rate = 44100;
ss.channels = 2;

pa_simple *s_in, *s_out = NULL;

AudioCapt *m_pMyObject;

for(;;)
{
uint8_t buf[BUFSIZE];
ssize_t r;
m_pMyObject->RecordSound(argc,argv,s_in,ss,s_out,buf,r);
m_pMyObject->PlaybackSound(argc,argv,s_out,ss,buf,r);
}
return 0;
}

Код C:

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>

#include <pulse/simple.h>
#include <pulse/error.h>

#define BUFSIZE 32

int main(int argc, char*argv[]) {

/* The Sample format to use */
static const pa_sample_spec ss = {
.format = PA_SAMPLE_S16LE,
.rate = 44100,
.channels = 2
};

pa_simple *s_in, *s_out = NULL;
int ret = 1;
int error;/* Create a new playback stream */
if (!(s_out = pa_simple_new(NULL, argv[0], PA_STREAM_PLAYBACK, NULL, "playback", &ss, NULL, NULL, &error))) {
fprintf(stderr, __FILE__": pa_simple_new() failed: %s\n", pa_strerror(error));
goto finish;
}

if (!(s_in = pa_simple_new(NULL, argv[0], PA_STREAM_RECORD, NULL, "record", &ss, NULL, NULL, &error))) {
fprintf(stderr, __FILE__": pa_simple_new() failed: %s\n", pa_strerror(error));
goto finish;
}

for (;;) {
uint8_t buf[BUFSIZE];
ssize_t r;

#if 1
pa_usec_t latency;

if ((latency = pa_simple_get_latency(s_in, &error)) == (pa_usec_t) -1) {
fprintf(stderr, __FILE__": pa_simple_get_latency() failed: %s\n", pa_strerror(error));
goto finish;
}

fprintf(stderr, "In:  %0.0f usec    \r\n", (float)latency);

if ((latency = pa_simple_get_latency(s_out, &error)) == (pa_usec_t) -1) {
fprintf(stderr, __FILE__": pa_simple_get_latency() failed: %s\n", pa_strerror(error));
goto finish;
}

fprintf(stderr, "Out: %0.0f usec    \r\n", (float)latency);
#endif

if (pa_simple_read(s_in, buf, sizeof(buf), &error) < 0) {

fprintf(stderr, __FILE__": read() failed: %s\n", strerror(errno));
goto finish;
}
printf("Buffer :::: %d\n",buf[0]);

/* ... and play it */
if (pa_simple_write(s_out, buf, sizeof(buf), &error) < 0) {
fprintf(stderr, __FILE__": pa_simple_write() failed: %s\n", pa_strerror(error));
goto finish;
}
}

/* Make sure that every single sample was played */
if (pa_simple_drain(s_out, &error) < 0) {
fprintf(stderr, __FILE__": pa_simple_drain() failed: %s\n", pa_strerror(error));
goto finish;
}

ret = 0;

finish:

if (s_in)
pa_simple_free(s_in);
if (s_out)
pa_simple_free(s_out);

return ret;
}

-1

Решение

В RecordSound и PlaybackSound вы инициализируете временные переменные с помощью pa_simple_new. Это значение теряется при возврате функции, и вы передаете NULL следующему.

2

Другие решения

Я бы предложил включить проверки компилятора и исправить все ошибки и предупреждения, выданные вашим компилятором в этом коде.

Для начала m_pMyObject никогда не инициализируется, поэтому использование его в вызове RecordSound будет означать передачу неинициализированного значения как «this» в метод. Обычно это плохо.

В RecordSound и PlaybackSound вы используете размер (buf), чтобы сообщить библиотеке, сколько байтов нужно прочитать / записать. Параметр buf является указателем на uint8_t. Таким образом, компилятор заполняет размер указателя (вероятно, 8 на 64-битной машине). В этих методах вы должны использовать параметр, который у вас есть для размера. В вызовах передайте sizeof (buf) этому параметру.

Я не знаю, сколько потоков может создать библиотека, прежде чем закончится память / ресурсы. Каждый вызов RecordSound создает поток записи, а PlaybackSound создает поток воспроизведения. Эти потоки никогда не освобождаются.

Итак, подведем итог: если использование неинициализированного значения для вызова метода RecordSound не вызывает сбой программы, она создаст поток записи и запишет пару сэмплов, а затем создаст поток воспроизведения и воспроизведет эти два сэмпла. Затем он попытается сделать все это снова.

1

По вопросам рекламы [email protected]