Название: Наложение звуков
Отправлено: Firefox от Сентябрь 18, 2014, 16:01
Здравствуйте. Проблема у меня такого характера. Раньше на 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(); }
}
В чем может быть проблема?
Название: Re: Наложение звуков
Отправлено: Firefox от Сентябрь 24, 2014, 10:47
В общем-то проблема решилась. Немного переделала программу, но суть оказалась в следующем: читаю данные из файла в массив char, но складывать их в беззнаковом виде нельзя, это и дает кракозябру, пришлось переводить сначало в беззнаковый char, потом складывать, а потом только писать обратно в файл char(знаковый).
Название: Re: Наложение звуков
Отправлено: Coffeesomtum от Октябрь 20, 2014, 13:44
Удивительный. Как это можно сделать? Я никогда не видел.
|