Russian Qt Forum
Ноябрь 25, 2024, 04:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Наложение звуков  (Прочитано 3769 раз)
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();
    }


}

В чем может быть проблема?
Записан
Firefox
Гость
« Ответ #1 : Сентябрь 24, 2014, 10:47 »

В общем-то проблема решилась. Немного переделала программу, но суть оказалась в следующем: читаю данные из файла в массив char, но складывать их в беззнаковом виде нельзя, это и дает кракозябру, пришлось переводить сначало в беззнаковый  char, потом складывать, а потом только писать обратно в файл char(знаковый).
Записан
Coffeesomtum
Гость
« Ответ #2 : Октябрь 20, 2014, 13:44 »

Удивительный. Как это можно сделать? Я никогда не видел.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.208 секунд. Запросов: 20.