Здравствуйте. Проблема у меня такого характера. Раньше на Windows с помощью DirectSound записывался звук. потом звук накладывался со смещением чтобы получить небольшое эхо. Понадобилось вто тоже на Linux. запись звука без проблем происходит. Пишу в raw файл, потому как звук воспроизвожу тоже из программы.
Пишу звук так
//h
#ifndef SOUND_WRITE_H
#define SOUND_WRITE_H
#include <QMainWindow>
#include <QFile>
#include <Qt/qaudioinput.h>
#include <QAudioInput>
#include <QAudioOutput>
#include <QDebug>
class sound_write : public QMainWindow
{
Q_OBJECT
public:
explicit sound_write(QWidget *parent = 0);
~sound_write();
QFile outputFile; // class member.
QAudioInput* audio; // class member.
QAudioFormat format;
QFile inputFile; // class member.
QAudioOutput* audio_out; // class member.
bool flag_audio; // флаг о том что аудио указатель существует
private:
public slots:
void stopRecording();
void writeDataFromMicrophone();
void playSound();
void finishedPlaying(QAudio::State state);
};
#endif // SOUND_WRITE_H
// срр
#include "sound_write.h"
sound_write::sound_write(QWidget *parent) :
QMainWindow(parent)
{
outputFile.setFileName("Sound.raw");
inputFile.setFileName("Sound.raw");
// set up the format you want, eg.
format.setFrequency(11025);
format.setChannels(1);
format.setSampleSize(8);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::UnSignedInt);
flag_audio=false;
}
sound_write::~sound_write()
{
if(outputFile.isOpen())
outputFile.close();
if(!flag_audio)
return;
if(audio->state()==QAudio::ActiveState)
audio->stop();
if(audio_out->state()==QAudio::ActiveState)
audio_out->stop();
}
void sound_write::writeDataFromMicrophone()
{
outputFile.open( QIODevice::WriteOnly | QIODevice::Truncate );
QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice();
if (!info.isFormatSupported(format)) {
qDebug()<<"default format not supported try to use nearest";
format = info.nearestFormat(format);
}
audio = new QAudioInput(format, this);
audio->start(&outputFile);
flag_audio=true;
}
void sound_write::stopRecording()
{
audio->stop();
outputFile.close();
delete audio;
flag_audio=false;
}
void sound_write::playSound()
{
inputFile.open(QIODevice::ReadOnly);
QAudioDeviceInfo inf(QAudioDeviceInfo::defaultOutputDevice());
if (!inf.isFormatSupported(format)) {
qDebug()<<"raw audio format not supported by backend, cannot play audio.";
return;
}
audio_out = new QAudioOutput(format, this);
connect(audio_out,SIGNAL(stateChanged(QAudio::State)),SLOT(finishedPlaying(QAudio::State)));
audio_out->start(&inputFile);
}
void sound_write::finishedPlaying(QAudio::State state)
{
if(state == QAudio::IdleState)
{
audio_out->stop();
inputFile.close();
}
}
Здесь все нормально а вот при наложении которое раньше не доставляло проблем, получается шум и шипение и речи почти не слышно.
Наложение
#ifndef SOUND_ISK_H
#define SOUND_ISK_H
#include <QWidget>
#include <QFile>
#include <QDebug>
class Sound_isk : public QWidget
{
Q_OBJECT
public:
explicit Sound_isk(QWidget *parent = 0);
~Sound_isk();
void Sum_sound_data(int isk);
private:
};
#include "sound_isk.h"
Sound_isk::Sound_isk(QWidget *parent) :
QWidget(parent)
{
}
Sound_isk::~Sound_isk()
{
}
void Sound_isk::Sum_sound_data(int isk)
{
QByteArray line;
QFile file("Sound.raw");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return;
while (!file.atEnd())
line = file.readLine();
file.close();
int dwDataSize=line.size();
//char *line= new char[dwDataSize];
//line=rez;
if(dwDataSize>0)
{
int newSize=2048;
char *dataSound= new char[dwDataSize+newSize];
for(int i=0;i<dwDataSize;i++)
dataSound[i]=line[i];
for(int i=0;i<dwDataSize;i++)
{
if(isk==0)
break;
if(isk==1)
{
dataSound[i+newSize]+= 0.06 * line[i]; //Сдвигаем и слогаем текущий(исходный) байт * на коэффициент первого затухания
}
if(isk==2)
{
dataSound[i+newSize]+= 0.06 * line[i]; //Сдвигаем и слогаем текущий(исходный) байт * на коэффициент первого затухания
dataSound[i+newSize/2]+= 0.09 * line[i]; //Сдвигаем и слогаем текущий(исходный) байт * на коэффициент первого затухания
}
}
int ss=strlen(dataSound);
int yy=strlen(dataSound);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
return;
int res=file.write(dataSound,dwDataSize+newSize);
file.close();
}
}
В чем может быть проблема?