Fixed segmentation fault

pull/108/head
Marcin Kondej 2020-03-21 00:25:14 +01:00
rodzic a318ccf1ef
commit 289452df12
4 zmienionych plików z 23 dodań i 18 usunięć

Wyświetl plik

@ -38,11 +38,11 @@
#include <unistd.h>
bool stop = false;
Transmitter *transmitter = NULL;
Transmitter *transmitter = nullptr;
void sigIntHandler(int sigNum)
{
if (transmitter != NULL) {
if (transmitter != nullptr) {
std::cout << "Stopping..." << std::endl;
transmitter->Stop();
stop = true;
@ -87,8 +87,14 @@ int main(int argc, char** argv)
signal(SIGINT, sigIntHandler);
signal(SIGTSTP, sigIntHandler);
auto finally = [&]() {
delete transmitter;
transmitter = nullptr;
};
try {
transmitter = &Transmitter::GetInstance();
transmitter = new Transmitter();
std::cout << "Broadcasting at " << frequency << " MHz with "
<< bandwidth << " kHz bandwidth" << std::endl;
do {
std::string filename = argv[optind++];
if ((optind == argc) && loop) {
@ -96,8 +102,6 @@ int main(int argc, char** argv)
}
WaveReader reader(filename != "-" ? filename : std::string(), stop);
WaveHeader header = reader.GetHeader();
std::cout << "Broadcasting at " << frequency << " MHz with "
<< bandwidth << " kHz bandwidth" << std::endl;
std::cout << "Playing: " << reader.GetFilename() << ", "
<< header.sampleRate << " Hz, "
<< header.bitsPerSample << " bits, "
@ -106,8 +110,10 @@ int main(int argc, char** argv)
} while (!stop && (optind < argc));
} catch (std::exception &catched) {
std::cout << "Error: " << catched.what() << std::endl;
finally();
return 1;
}
finally();
return 0;
}

Wyświetl plik

@ -1,5 +1,5 @@
EXECUTABLE = fm_transmitter
VERSION = 0.9.3
VERSION = 0.9.4
FLAGS = -Wall -O3 -std=c++11
all: main.o mailbox.o sample.o wave_reader.o transmitter.o

Wyświetl plik

@ -220,7 +220,7 @@ class ClockDevice : public Device
{
public:
ClockDevice(uint32_t clockAddress, unsigned divisor) {
clock = reinterpret_cast<ClockRegisters *>(peripherals->GetVirtualAddress(CLK0_BASE_OFFSET));
clock = reinterpret_cast<ClockRegisters *>(peripherals->GetVirtualAddress(clockAddress));
clock->ctl = (0x5a << 24) | 0x06;
std::this_thread::sleep_for(std::chrono::microseconds(1000));
clock->div = (0x5a << 24) | (0xffffff & divisor);
@ -301,6 +301,8 @@ class DMAController : public Device
volatile DMARegisters *dma;
};
bool Transmitter::transmitting = false;
Transmitter::Transmitter()
: output(nullptr), stopped(true)
{
@ -312,17 +314,12 @@ Transmitter::~Transmitter() {
}
}
Transmitter &Transmitter::GetInstance()
{
static Transmitter instance;
return instance;
}
void Transmitter::Transmit(WaveReader &reader, float frequency, float bandwidth, unsigned dmaChannel, bool preserveCarrier)
{
if (!stopped) {
throw std::runtime_error("Cannot play, transmitter already in use");
if (transmitting) {
throw std::runtime_error("Cannot transmit, transmitter already in use");
}
transmitting = true;
stopped = false;
WaveHeader header = reader.GetHeader();
@ -339,8 +336,8 @@ void Transmitter::Transmit(WaveReader &reader, float frequency, float bandwidth,
if (!preserveCarrier) {
delete output;
output = nullptr;
stopped = true;
}
transmitting = false;
};
try {
if (dmaChannel != 0xff) {
@ -374,6 +371,7 @@ void Transmitter::TransmitViaCpu(WaveReader &reader, ClockOutput &output, unsign
std::this_thread::sleep_for(std::chrono::microseconds(BUFFER_TIME / 2));
auto finally = [&]() {
stopped = true;
transmitterThread.join();
samples.clear();
};
@ -458,6 +456,7 @@ void Transmitter::TransmitViaDma(WaveReader &reader, ClockOutput &output, unsign
while (dma.GetControllBlockAddress() != 0x00000000) {
std::this_thread::sleep_for(std::chrono::microseconds(1000));
}
stopped = true;
samples.clear();
};
try {

Wyświetl plik

@ -42,19 +42,19 @@ class ClockOutput;
class Transmitter
{
public:
Transmitter();
virtual ~Transmitter();
Transmitter(const Transmitter &) = delete;
Transmitter(Transmitter &&) = delete;
Transmitter &operator=(const Transmitter &) = delete;
static Transmitter &GetInstance();
void Transmit(WaveReader &reader, float frequency, float bandwidth, unsigned dmaChannel, bool preserveCarrier);
void Stop();
private:
Transmitter();
void TransmitViaCpu(WaveReader &reader, ClockOutput &output, unsigned sampleRate, unsigned bufferSize, unsigned clockDivisor, unsigned divisorRange);
void TransmitViaDma(WaveReader &reader, ClockOutput &output, unsigned sampleRate, unsigned bufferSize, unsigned clockDivisor, unsigned divisorRange, unsigned dmaChannel);
static void TransmitterThread(Transmitter *instance, ClockOutput *output, unsigned sampleRate, unsigned clockDivisor, unsigned divisorRange, unsigned *sampleOffset, std::vector<Sample> *samples);
static bool transmitting;
ClockOutput *output;
std::mutex access;
bool stopped;