//.H**********************************************************
class QPcmToWav : public QObject
{
Q_OBJECT
public:
QPcmToWav(QObject *parent = 0);
void setFormat(const QAudioFormat &format);
bool pcmToWav(const QByteArray &pcmData,QByteArray &wavData);
protected:
QAudioFormat m_format;
};
class QPcmToWav : public QObject
{
Q_OBJECT
public:
QPcmToWav(QObject *parent = 0);
void setFormat(const QAudioFormat &format);
bool pcmToWav(const QByteArray &pcmData,QByteArray &wavData);
protected:
QAudioFormat m_format;
};
//.CPP******************************************************
typedef struct
{
char fccID[4]; //"RIFF"
unsigned long dwSize; //length-8
char fccType[4]; //"WAVE"
}FCC_HEADER;
typedef struct
{
char fccID[4]; //"fmt "
unsigned long dwSize; //16
unsigned short wFormatTag; //1
unsigned short wChannels; //1 or 2
unsigned long dwSamplesPerSec; //44100
unsigned long dwAvgBytesPerSec; //
unsigned short wBlockAlign; //声道数*量化数/8
unsigned short uiBitsPerSample; //量化数 8 or 16
}FMT;
typedef struct
{
char fccID[4]; //"data"
unsigned long dwSize; //length-44
}DATA_HEADER;
typedef struct
{
FCC_HEADER fccHeader;
FMT fmt;
DATA_HEADER dataHeader;
}WAV_HEADER;
QPcmToWav::QPcmToWav(QObject *parent) :
QObject(parent)
{
}
void QPcmToWav::setFormat(const QAudioFormat &format)
{
m_format = format;
}
bool QPcmToWav::pcmToWav(const QByteArray &pcmData,QByteArray &wavData)
{
WAV_HEADER header;
qstrcpy(header.fccHeader.fccID,"RIFF");
header.fccHeader.dwSize = 44 + pcmData.size() - 8;
qstrcpy(header.fccHeader.fccType,"WAVE");
qstrcpy(header.fmt.fccID,"fmt ");
header.fmt.dwSize = 16;
header.fmt.wFormatTag = 1;
header.fmt.wChannels = m_format.channelCount();
header.fmt.dwSamplesPerSec = m_format.sampleRate();
header.fmt.dwAvgBytesPerSec = m_format.sampleRate() * (m_format.sampleSize() / 8);
header.fmt.wBlockAlign = m_format.sampleSize() / 8;
header.fmt.uiBitsPerSample = m_format.sampleSize();
qstrcpy(header.dataHeader.fccID,"data");
header.dataHeader.dwSize = pcmData.size();
char * pHeader = (char*)&header;
int size = sizeof(header);
wavData.append(pHeader,size);
wavData.append(pcmData);
return true;
}
{
char fccID[4]; //"RIFF"
unsigned long dwSize; //length-8
char fccType[4]; //"WAVE"
}FCC_HEADER;
typedef struct
{
char fccID[4]; //"fmt "
unsigned long dwSize; //16
unsigned short wFormatTag; //1
unsigned short wChannels; //1 or 2
unsigned long dwSamplesPerSec; //44100
unsigned long dwAvgBytesPerSec; //
unsigned short wBlockAlign; //声道数*量化数/8
unsigned short uiBitsPerSample; //量化数 8 or 16
}FMT;
typedef struct
{
char fccID[4]; //"data"
unsigned long dwSize; //length-44
}DATA_HEADER;
typedef struct
{
FCC_HEADER fccHeader;
FMT fmt;
DATA_HEADER dataHeader;
}WAV_HEADER;
QPcmToWav::QPcmToWav(QObject *parent) :
QObject(parent)
{
}
void QPcmToWav::setFormat(const QAudioFormat &format)
{
m_format = format;
}
bool QPcmToWav::pcmToWav(const QByteArray &pcmData,QByteArray &wavData)
{
WAV_HEADER header;
qstrcpy(header.fccHeader.fccID,"RIFF");
header.fccHeader.dwSize = 44 + pcmData.size() - 8;
qstrcpy(header.fccHeader.fccType,"WAVE");
qstrcpy(header.fmt.fccID,"fmt ");
header.fmt.dwSize = 16;
header.fmt.wFormatTag = 1;
header.fmt.wChannels = m_format.channelCount();
header.fmt.dwSamplesPerSec = m_format.sampleRate();
header.fmt.dwAvgBytesPerSec = m_format.sampleRate() * (m_format.sampleSize() / 8);
header.fmt.wBlockAlign = m_format.sampleSize() / 8;
header.fmt.uiBitsPerSample = m_format.sampleSize();
qstrcpy(header.dataHeader.fccID,"data");
header.dataHeader.dwSize = pcmData.size();
char * pHeader = (char*)&header;
int size = sizeof(header);
wavData.append(pHeader,size);
wavData.append(pcmData);
return true;
}