mirror of https://github.com/F5OEO/rpitx
Ignore certain signals
This commit is contained in:
parent
58b5585dc2
commit
fadb0acbc4
41
src/RpiDma.c
41
src/RpiDma.c
|
|
@ -3,7 +3,21 @@
|
|||
#include <signal.h>
|
||||
#include "RpiDma.h"
|
||||
#include "RpiGpio.h"
|
||||
char InitDma(void *FunctionTerminate)
|
||||
|
||||
static int compareInts(const void* first, const void* second) {
|
||||
const int firstInt = *((int*)first);
|
||||
const int secondInt = *((int*)second);
|
||||
if (firstInt < secondInt) {
|
||||
return -1;
|
||||
}
|
||||
if (firstInt == secondInt) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
char InitDma(void *FunctionTerminate, int* skipSignals)
|
||||
{
|
||||
DMA_CHANNEL=4;
|
||||
char *line = NULL;
|
||||
|
|
@ -31,15 +45,32 @@ char InitDma(void *FunctionTerminate)
|
|||
pclose(flinux);
|
||||
//printf("Init DMA\n");
|
||||
|
||||
int sentinel[] = {0};
|
||||
if (skipSignals == NULL) {
|
||||
skipSignals = sentinel;
|
||||
}
|
||||
int sentinelIndex;
|
||||
for (sentinelIndex = 0; ; ++sentinelIndex) {
|
||||
if (skipSignals[sentinelIndex] == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
qsort(skipSignals, sentinelIndex, sizeof(int), compareInts);
|
||||
|
||||
// Catch all signals possible - it is vital we kill the DMA engine
|
||||
// on process exit!
|
||||
int i;
|
||||
for (i = 0; i < 64; i++) {
|
||||
struct sigaction sa;
|
||||
// Some signals are fine, so don't catch them
|
||||
if (i == *skipSignals) {
|
||||
++skipSignals;
|
||||
} else {
|
||||
struct sigaction sa;
|
||||
|
||||
memset(&sa, 0, sizeof(sa));
|
||||
sa.sa_handler = FunctionTerminate;//terminate;
|
||||
sigaction(i, &sa, NULL);
|
||||
memset(&sa, 0, sizeof(sa));
|
||||
sa.sa_handler = FunctionTerminate;//terminate;
|
||||
sigaction(i, &sa, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
//NUM_SAMPLES = NUM_SAMPLES_MAX;
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
#include <sys/mman.h>
|
||||
#include "mailbox.h"
|
||||
|
||||
char InitDma(void *FunctionTerminate);
|
||||
char InitDma(void *FunctionTerminate, int* skipSignals);
|
||||
uint32_t mem_virt_to_phys(volatile void *virt);
|
||||
uint32_t mem_phys_to_virt(volatile uint32_t phys);
|
||||
|
||||
|
|
|
|||
13
src/RpiTx.c
13
src/RpiTx.c
|
|
@ -173,7 +173,7 @@ terminate(int dummy)
|
|||
{
|
||||
stop_dma();
|
||||
//munmap(virtbase,NUM_PAGES * PAGE_SIZE);
|
||||
printf("END OF PiTx\n", dummy);
|
||||
printf("END OF PiTx\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
|
@ -951,10 +951,10 @@ void update_ppm(
|
|||
}
|
||||
}
|
||||
|
||||
int pitx_init(int SampleRate,double TuningFrequency)
|
||||
int pitx_init(int SampleRate, double TuningFrequency, int* skipSignals)
|
||||
{
|
||||
InitGpio();
|
||||
InitDma(terminate);
|
||||
InitDma(terminate, skipSignals);
|
||||
|
||||
SetupGpioClock(SampleRate,TuningFrequency);
|
||||
|
||||
|
|
@ -1141,7 +1141,7 @@ main(int argc, char* argv[])
|
|||
}
|
||||
|
||||
resetFile();
|
||||
return pitx_run(Mode, SampleRate, SetFrequency, ppmpll, NoUsePwmFrequency, readFile, resetFile);
|
||||
return pitx_run(Mode, SampleRate, SetFrequency, ppmpll, NoUsePwmFrequency, readFile, resetFile, NULL);
|
||||
}
|
||||
|
||||
int pitx_run(
|
||||
|
|
@ -1151,7 +1151,8 @@ int pitx_run(
|
|||
const float ppmpll,
|
||||
const char NoUsePwmFrequency,
|
||||
ssize_t (*readWrapper)(void *buffer, size_t count),
|
||||
void (*reset)(void)
|
||||
void (*reset)(void),
|
||||
int* skipSignals
|
||||
) {
|
||||
int i;
|
||||
//char pagemap_fn[64];
|
||||
|
|
@ -1213,7 +1214,7 @@ int pitx_run(
|
|||
|
||||
|
||||
pitx_SetTuneFrequency(SetFrequency*1000.0);
|
||||
pitx_init(SampleRate,GlobalTuningFrequency);
|
||||
pitx_init(SampleRate, GlobalTuningFrequency, skipSignals);
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
#define RPITX_H
|
||||
#include <ctype.h>
|
||||
|
||||
int pitx_init(int SampleRate,double TuningFrequency);
|
||||
int pitx_init(int SampleRate, double TuningFrequency, int* skipSignals);
|
||||
int pitx_SetTuneFrequencyu(uint32_t Frequency);
|
||||
|
||||
#define MODE_IQ 0
|
||||
|
|
@ -20,7 +20,8 @@ int pitx_run(
|
|||
// Wrapper around read to read wav file bytes
|
||||
ssize_t (*readWrapper)(void *buffer, size_t count),
|
||||
// Wrapper to reset file for looping
|
||||
void (*reset)(void)
|
||||
void (*reset)(void),
|
||||
int* skipSignals
|
||||
);
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -135,7 +135,14 @@ _rpitx_broadcast_fm(PyObject* self, PyObject* args) {
|
|||
}
|
||||
bitRate = sfInfo.samplerate;
|
||||
|
||||
pitx_run(MODE_RF, bitRate, frequency * 1000.0, 0.0, 0, formatRfWrapper, reset);
|
||||
int skipSignals[] = {
|
||||
SIGALRM,
|
||||
SIGVTALRM,
|
||||
SIGCHLD, // We fork whenever calling broadcast_fm
|
||||
SIGWINCH, // Window resized
|
||||
0
|
||||
};
|
||||
pitx_run(MODE_RF, bitRate, frequency * 1000.0, 0.0, 0, formatRfWrapper, reset, skipSignals);
|
||||
sf_close(sndFile);
|
||||
|
||||
Py_RETURN_NONE;
|
||||
|
|
|
|||
Loading…
Reference in New Issue