Skip to content

Commit

Permalink
Refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
markondej committed Dec 14, 2016
1 parent d992c03 commit daf16ba
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 75 deletions.
102 changes: 52 additions & 50 deletions transmitter.cpp
Expand Up @@ -48,12 +48,10 @@ using std::ostringstream;
#define CLK0DIV_BASE 0x00101074
#define TCNT_BASE 0x00003004

#define STDIN_READ_DELAY 700000

#define ACCESS(base, offset) *(volatile unsigned*)((int)base + offset)
#define ACCESS64(base, offset) *(volatile unsigned long long*)((int)base + offset)

bool Transmitter::isTransmitting = false;
bool Transmitter::transmitting = false;
bool Transmitter::restart = false;
unsigned Transmitter::clockDivisor = 0;
unsigned Transmitter::frameOffset = 0;
Expand Down Expand Up @@ -106,82 +104,86 @@ Transmitter* Transmitter::getInstance()

void Transmitter::play(string filename, double frequency, bool loop)
{
if (isTransmitting) {
if (transmitting) {
throw ErrorReporter("Cannot play, transmitter already in use");
}

isTransmitting = true;
transmitting = true;
forceStop = false;

WaveReader* reader = new WaveReader(filename != "-" ? filename : string(), forceStop);
WaveReader* reader = reader = new WaveReader(filename != "-" ? filename : string(), forceStop);
AudioFormat* format = reader->getFormat();
if (filename == "-") {
usleep(STDIN_READ_DELAY);
}

clockDivisor = (unsigned)((500 << 12) / frequency + 0.5);
unsigned bufferFrames = (unsigned)((unsigned long long)format->sampleRate * BUFFER_TIME / 1000000);

frameOffset = 0;
restart = false;

vector<float>* frames = reader->getFrames(bufferFrames, 0, forceStop);
if (!forceStop) {
try {
vector<float>* frames = reader->getFrames(bufferFrames, 0, forceStop);
if (frames == NULL) {
delete format;
delete reader;
return;
}
eof = frames->size() < bufferFrames;
buffer = frames;
} else {
delete format;
delete reader;
return;
}

pthread_t thread;
void* params = (void*)&format->sampleRate;

int returnCode = pthread_create(&thread, NULL, &Transmitter::transmit, params);
if (returnCode) {
delete reader;
delete format;
ostringstream oss;
oss << "Cannot create new thread (code: " << returnCode << ")";
throw ErrorReporter(oss.str());
}
pthread_t thread;
void* params = (void*)&format->sampleRate;

int returnCode = pthread_create(&thread, NULL, &Transmitter::transmit, params);
if (returnCode) {
delete reader;
delete format;
delete frames;
ostringstream oss;
oss << "Cannot create new thread (code: " << returnCode << ")";
throw ErrorReporter(oss.str());
}

usleep(BUFFER_TIME / 2);
usleep(BUFFER_TIME / 2);

while (!forceStop) {
while (!eof && !forceStop) {
if (buffer == NULL) {
frames = reader->getFrames(bufferFrames, frameOffset + bufferFrames, forceStop);
if (!forceStop) {
while (!forceStop) {
while (!eof && !forceStop) {
if (buffer == NULL) {
frames = reader->getFrames(bufferFrames, frameOffset + bufferFrames, forceStop);
if (frames == NULL) {
forceStop = true;
break;
}
eof = frames->size() < bufferFrames;
buffer = frames;
}
}
if (!forceStop) {
usleep(BUFFER_TIME / 2);
}
}
if (loop && !forceStop) {
frameOffset = 0;
restart = true;
frames = reader->getFrames(bufferFrames, 0, forceStop);
if (!forceStop) {
if (loop && !forceStop) {
frameOffset = 0;
restart = true;
frames = reader->getFrames(bufferFrames, 0, forceStop);
if (frames == NULL) {
break;
}
eof = frames->size() < bufferFrames;
buffer = frames;
usleep(BUFFER_TIME / 2);
} else {
forceStop = true;
}
} else {
forceStop = true;
}
}
isTransmitting = false;
transmitting = false;

pthread_join(thread, NULL);
pthread_join(thread, NULL);
} catch (ErrorReporter &error) {
delete reader;
delete format;
throw error;
}

delete reader;
delete format;
}
}

void* Transmitter::transmit(void* params)
{
Expand All @@ -206,13 +208,13 @@ void* Transmitter::transmit(void* params)
playbackStart = ACCESS64(peripherals, TCNT_BASE);
current = playbackStart;

while (isTransmitting) {
while (transmitting) {
start = current;
while ((buffer == NULL) && isTransmitting) {
while ((buffer == NULL) && transmitting) {
usleep(1);
current = ACCESS64(peripherals, TCNT_BASE);
}
if (!isTransmitting) {
if (!transmitting) {
break;
}
if (restart) {
Expand Down
2 changes: 1 addition & 1 deletion transmitter.h
Expand Up @@ -60,7 +60,7 @@ class Transmitter

static void* peripherals;
static vector<float>* buffer;
static bool isTransmitting, restart;
static bool transmitting, restart;
static unsigned frameOffset, clockDivisor;
static void* transmit(void* params);
};
Expand Down
42 changes: 19 additions & 23 deletions wave_reader.cpp
Expand Up @@ -43,7 +43,7 @@ using std::ostringstream;
using std::exception;

WaveReader::WaveReader(string filename, bool &forceStop) :
filename(filename), fileSize(0), isHeaderRead(false)
filename(filename), fileSize(0), headerComplete(false)
{
char* headerData = (char*)((void*)&header);
vector<char>* data;
Expand Down Expand Up @@ -71,8 +71,8 @@ WaveReader::WaveReader(string filename, bool &forceStop) :
bytesToRead = sizeof(PCMWaveHeader::chunkID) + sizeof(PCMWaveHeader::chunkSize) +
sizeof(PCMWaveHeader::format);
data = readData(bytesToRead, forceStop);
if (forceStop) {
return;
if (data == NULL) {
throw ErrorReporter("Cannot obtain header, program interrupted");
}
memcpy(headerData, &(*data)[0], bytesToRead);
headerOffset = bytesToRead;
Expand All @@ -85,8 +85,8 @@ WaveReader::WaveReader(string filename, bool &forceStop) :

bytesToRead = sizeof(PCMWaveHeader::subchunk1ID) + sizeof(PCMWaveHeader::subchunk1Size);
data = readData(bytesToRead, forceStop);
if (forceStop) {
return;
if (data == NULL) {
throw ErrorReporter("Cannot obtain header, program interrupted");
}
memcpy(&headerData[headerOffset], &(*data)[0], bytesToRead);
headerOffset += bytesToRead;
Expand All @@ -101,8 +101,8 @@ WaveReader::WaveReader(string filename, bool &forceStop) :
}

data = readData(header.subchunk1Size, forceStop);
if (forceStop) {
return;
if (data == NULL) {
throw ErrorReporter("Cannot obtain header, program interrupted");
}
memcpy(&headerData[headerOffset], &(*data)[0], subchunk1MinSize);
headerOffset += subchunk1MinSize;
Expand All @@ -118,8 +118,8 @@ WaveReader::WaveReader(string filename, bool &forceStop) :

bytesToRead = sizeof(PCMWaveHeader::subchunk2ID) + sizeof(PCMWaveHeader::subchunk2Size);
data = readData(bytesToRead, forceStop);
if (forceStop) {
return;
if (data == NULL) {
throw ErrorReporter("Cannot obtain header, program interrupted");
}
memcpy(&headerData[headerOffset], &(*data)[0], bytesToRead);
headerOffset += bytesToRead;
Expand All @@ -129,8 +129,6 @@ WaveReader::WaveReader(string filename, bool &forceStop) :
oss << "Error while opening " << getFilename() << ", data corrupted";
throw ErrorReporter(oss.str());
}

isHeaderRead = true;
} catch (ErrorReporter &error) {
if (fileDescriptor != STDIN_FILENO) {
close(fileDescriptor);
Expand All @@ -150,6 +148,10 @@ WaveReader::~WaveReader()
}
}

bool WaveReader::isHeaderLoaded() {
return isHeader;
}

vector<char>* WaveReader::readData(unsigned bytesToRead, bool &forceStop)
{
unsigned bytesRead = 0;
Expand All @@ -162,22 +164,22 @@ vector<char>* WaveReader::readData(unsigned bytesToRead, bool &forceStop)
((bytes == 0) && !isHeaderRead && (fileDescriptor != STDIN_FILENO))) {
delete data;

if (!isHeaderRead && (fileDescriptor != STDIN_FILENO)) {
if (fileDescriptor != STDIN_FILENO) {
close(fileDescriptor);
}

ostringstream oss;
oss << "Error while reading " << getFilename() << ", file is corrupted";
throw ErrorReporter(oss.str());
}
if ((bytes == 0) && (fileDescriptor != STDIN_FILENO)) {
data->resize(bytes);
break;
}
if (bytes > 0) {
bytesRead += bytes;
}
if (bytesRead < bytesToRead) {
if (fileDescriptor != STDIN_FILENO) {
data->resize(bytes);
break;
}
usleep(1);
}
}
Expand All @@ -192,12 +194,6 @@ vector<char>* WaveReader::readData(unsigned bytesToRead, bool &forceStop)

vector<float>* WaveReader::getFrames(unsigned frameCount, unsigned frameOffset, bool &forceStop) {
unsigned bytesToRead, bytesLeft, bytesPerFrame, offset;

if (!isHeaderRead) {
ostringstream oss;
throw ErrorReporter("Header wasn't read successfully!");
}

vector<float>* frames = new vector<float>();
vector<char>* data;

Expand All @@ -221,7 +217,7 @@ vector<float>* WaveReader::getFrames(unsigned frameCount, unsigned frameOffset,
delete frames;
throw error;
}
if (forceStop) {
if (data == NULL) {
delete frames;
return NULL;
}
Expand Down
1 change: 0 additions & 1 deletion wave_reader.h
Expand Up @@ -55,7 +55,6 @@ class WaveReader
PCMWaveHeader header;
unsigned fileSize, dataOffset;
int fileDescriptor;
bool isHeaderRead;

vector<char>* readData(unsigned bytesToRead, bool &forceStop);
string getFilename();
Expand Down

0 comments on commit daf16ba

Please sign in to comment.