//// AudioWavFile.h// libraries/audio-client/src//// Created by Luis Cuenca on 12/1/2017.// Copyright 2017 High Fidelity, Inc.//// Distributed under the Apache License, Version 2.0.// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html// #include "AudioFileWav.h" bool AudioFileWav::create(const QAudioFormat& audioFormat, const QString& filepath) { if (_file.isOpen()) { _file.close(); } _file.setFileName(filepath); if (!_file.open(QIODevice::WriteOnly)) { return false; } addHeader(audioFormat); return true;} bool AudioFileWav::addRawAudioChunk(char* chunk, int size) { if (_file.isOpen()) { QDataStream stream(&_file); stream.writeRawData(chunk, size); return true; } return false;} void AudioFileWav::close() { QDataStream stream(&_file); stream.setByteOrder(QDataStream::LittleEndian); // fill RIFF and size data on header _file.seek(4); stream << quint32(_file.size() - 8); _file.seek(40); stream << quint32(_file.size() - 44); _file.close();} void AudioFileWav::addHeader(const QAudioFormat& audioFormat) { QDataStream stream(&_file); stream.setByteOrder(QDataStream::LittleEndian); // RIFF stream.writeRawData("RIFF", 4); stream << quint32(0); stream.writeRawData("WAVE", 4); // Format description PCM = 16 stream.writeRawData("fmt ", 4); stream << quint32(16); stream << quint16(1); stream << quint16(audioFormat.channelCount()); stream << quint32(audioFormat.sampleRate()); stream << quint32(audioFormat.sampleRate() * audioFormat.channelCount() * audioFormat.sampleSize() / 8); // bytes per second stream << quint16(audioFormat.channelCount() * audioFormat.sampleSize() / 8); // block align stream << quint16(audioFormat.sampleSize()); // bits Per Sample // Init data chunck stream.writeRawData("data", 4); stream << quint32(0);}
//
// AudioWavFile.h
// libraries/audio-client/src
//
// Created by Luis Cuenca on 12/1/2017.
// Copyright 2017 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#include "AudioFileWav.h"
bool AudioFileWav::create(const QAudioFormat& audioFormat, const QString& filepath) {
if (_file.isOpen()) {
_file.close();
}
_file.setFileName(filepath);
if (!_file.open(QIODevice::WriteOnly)) {
return false;
}
addHeader(audioFormat);
return true;
}
bool AudioFileWav::addRawAudioChunk(char* chunk, int size) {
if (_file.isOpen()) {
QDataStream stream(&_file);
stream.writeRawData(chunk, size);
return true;
}
return false;
}
void AudioFileWav::close() {
QDataStream stream(&_file);
stream.setByteOrder(QDataStream::LittleEndian);
// fill RIFF and size data on header
_file.seek(4);
stream << quint32(_file.size() - 8);
_file.seek(40);
stream << quint32(_file.size() - 44);
_file.close();
}
void AudioFileWav::addHeader(const QAudioFormat& audioFormat) {
QDataStream stream(&_file);
stream.setByteOrder(QDataStream::LittleEndian);
// RIFF
stream.writeRawData("RIFF", 4);
stream << quint32(0);
stream.writeRawData("WAVE", 4);
// Format description PCM = 16
stream.writeRawData("fmt ", 4);
stream << quint32(16);
stream << quint16(1);
stream << quint16(audioFormat.channelCount());
stream << quint32(audioFormat.sampleRate());
stream << quint32(audioFormat.sampleRate() * audioFormat.channelCount() * audioFormat.sampleSize() / 8); // bytes per second
stream << quint16(audioFormat.channelCount() * audioFormat.sampleSize() / 8); // block align
stream << quint16(audioFormat.sampleSize()); // bits Per Sample
// Init data chunck
stream.writeRawData("data", 4);
stream << quint32(0);
}