Skip to content

Commit

Permalink
boostify & style
Browse files Browse the repository at this point in the history
  • Loading branch information
pcgod committed Aug 7, 2010
1 parent 294e9ab commit 3cc3223
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 42 deletions.
2 changes: 1 addition & 1 deletion src/mumble/AudioOutput.cpp
Expand Up @@ -978,7 +978,7 @@ bool AudioOutput::mix(void *outbuff, unsigned int nsamp) {
const unsigned int nchan = iChannels;
boost::shared_ptr<VoiceRecorder> recorder;
if (g.sh) {
recorder = boost::shared_ptr<VoiceRecorder>(g.sh->recorder);
recorder = g.sh->recorder;
}

qrwlOutputs.lockForRead();
Expand Down
55 changes: 26 additions & 29 deletions src/mumble/VoiceRecorder.cpp
Expand Up @@ -34,31 +34,28 @@
#include "Audio.h"
#include "ClientUser.h"

VoiceRecorder::VoiceRecorder(QObject *p) : QThread(p), iSampleRate(0),
bRecording(false), bMixDown(false), uiRecordedSamples(0), recordUser(new RecordUser()) {
VoiceRecorder::RecordBuffer::RecordBuffer(const ClientUser *cu,
boost::shared_array<float> buffer, int samples) :
cuUser(cu), fBuffer(buffer), iSamples(samples) {
}

VoiceRecorder::~VoiceRecorder() {
stop();
wait();
clearLists();
delete recordUser;
VoiceRecorder::RecordInfo::RecordInfo() : sf(NULL), uiLastPosition(0) {
}

void VoiceRecorder::clearLists() {
while (!qhRecordBuffer.isEmpty()) {
delete qhRecordBuffer.takeFirst();
VoiceRecorder::RecordInfo::~RecordInfo() {
if (sf) {
sf_close(sf);
}
}

QHash<int, RecordInfo *>::iterator it = qhRecordInfo.begin();
while (it != qhRecordInfo.end()) {
RecordInfo *ri = it.value();
if (ri->sf) {
sf_close(ri->sf);
}
delete ri;
it = qhRecordInfo.erase(it);
}
VoiceRecorder::VoiceRecorder(QObject *p) : QThread(p), iSampleRate(0),
bRecording(false), bMixDown(false), uiRecordedSamples(0),
recordUser(new RecordUser()) {
}

VoiceRecorder::~VoiceRecorder() {
stop();
wait();
}

void VoiceRecorder::run() {
Expand All @@ -84,7 +81,7 @@ void VoiceRecorder::run() {
}

while (!qhRecordBuffer.isEmpty()) {
RecordBuffer *rb;
boost::shared_ptr<RecordBuffer> rb;
{
QMutexLocker l(&qmBufferLock);
rb = qhRecordBuffer.takeFirst();
Expand All @@ -93,7 +90,7 @@ void VoiceRecorder::run() {
int index = bMixDown ? 0 : rb->cuUser->uiSession;
Q_ASSERT(qhRecordInfo.contains(index));

RecordInfo *ri = qhRecordInfo.value(index);
boost::shared_ptr<RecordInfo> ri = qhRecordInfo.value(index);
if (!ri->sf) {
ri->sf = sf_open(qPrintable(qsFileName.arg(index)), SFM_WRITE, &sfinfo);
//sf_command(ri->sf, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE);
Expand All @@ -103,22 +100,20 @@ void VoiceRecorder::run() {

if (ri->uiLastPosition != uiRecordedSamples) {
// write silence until we reach our current sample value
float *buffer = new float[1024];
memset(buffer, 0, sizeof(float) * 1024);
boost::scoped_array<float> buffer(new float[1024]);
memset(buffer.get(), 0, sizeof(float) * 1024);
int rest = (uiRecordedSamples - ri->uiLastPosition) % 1024;
quint64 steps = (uiRecordedSamples - ri->uiLastPosition) / 1024;
for (quint64 i = 0; i < steps; ++i) {
sf_write_float(ri->sf, buffer, 1024);
sf_write_float(ri->sf, buffer.get(), 1024);
}
if (rest > 0)
sf_write_float(ri->sf, buffer, rest);
delete [] buffer;
sf_write_float(ri->sf, buffer.get(), rest);
}

sf_write_float(ri->sf, rb->fBuffer.get(), rb->iSamples);
uiRecordedSamples += rb->iSamples;
ri->uiLastPosition = uiRecordedSamples;
delete rb;
}

qmSleepLock.unlock();
Expand All @@ -136,11 +131,13 @@ void VoiceRecorder::addBuffer(const ClientUser *cu, boost::shared_array<float> b

{
QMutexLocker l(&qmBufferLock);
qhRecordBuffer << new RecordBuffer(cu, buffer, samples);
boost::shared_ptr<RecordBuffer> rb(new RecordBuffer(cu, buffer, samples));
qhRecordBuffer << rb;
}
int index = bMixDown ? 0 : cu->uiSession;
if (!qhRecordInfo.contains(index)) {
qhRecordInfo.insert(index, new RecordInfo());
boost::shared_ptr<RecordInfo> ri(new RecordInfo());
qhRecordInfo.insert(index, ri);
}
qwcSleep.wakeAll();
}
Expand Down
22 changes: 10 additions & 12 deletions src/mumble/VoiceRecorder.h
Expand Up @@ -37,25 +37,24 @@ class RecordUser;

class VoiceRecorder : public QThread {
private:
class RecordBuffer {
public:
struct RecordBuffer {
const ClientUser *cuUser;
boost::shared_array<float> fBuffer;
int iSamples;

RecordBuffer(const ClientUser *cu, boost::shared_array<float> buffer, int samples) : cuUser(cu), fBuffer(buffer), iSamples(samples) {}
explicit RecordBuffer(const ClientUser *cu, boost::shared_array<float> buffer, int samples);
};

class RecordInfo {
public:
struct RecordInfo {
SNDFILE *sf;
quint64 uiLastPosition;

RecordInfo() : sf(NULL), uiLastPosition(0) {}
explicit RecordInfo();
~RecordInfo();
};

QHash<int, RecordInfo *> qhRecordInfo;
QList<RecordBuffer *> qhRecordBuffer;
QHash< int, boost::shared_ptr<RecordInfo> > qhRecordInfo;
QList< boost::shared_ptr<RecordBuffer> > qhRecordBuffer;

QMutex qmBufferLock;
QMutex qmSleepLock;
Expand All @@ -66,19 +65,18 @@ class VoiceRecorder : public QThread {
QString qsFileName;
bool bMixDown;
quint64 uiRecordedSamples;
void clearLists();

public:
VoiceRecorder(QObject *p);
explicit VoiceRecorder(QObject *p);
~VoiceRecorder();
RecordUser *recordUser;
boost::scoped_ptr<RecordUser> recordUser;

void run();
void stop();
void addBuffer(const ClientUser *cu, boost::shared_array<float> buffer, int samples);
void addSilence(int samples);
void setSampleRate(int sampleRate);
void setFileName(QString fn);
void setFileName(QString fn);
void setMixDown(bool mixDown);
bool getMixDown();
};
Expand Down
2 changes: 2 additions & 0 deletions src/mumble/mumble_pch.hpp
Expand Up @@ -69,6 +69,8 @@
#include <boost/accumulators/statistics/extended_p_square.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/shared_array.hpp>
#include <boost/scoped_ptr.hpp>
#include <boost/scoped_array.hpp>
#include <boost/weak_ptr.hpp>
#include <boost/bind.hpp>
#ifdef Q_CC_GNU
Expand Down

0 comments on commit 3cc3223

Please sign in to comment.