kopia lustrzana https://github.com/markondej/fm_transmitter
Fixed segmentation fault
rodzic
a318ccf1ef
commit
289452df12
16
main.cpp
16
main.cpp
|
@ -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;
|
||||
}
|
||||
|
|
2
makefile
2
makefile
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
|
|
Ładowanie…
Reference in New Issue