forked from kgoba/ft8_lib
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request kgoba#37 from kgoba/update_to_0_2
Update to 0.2
- Loading branch information
Showing
161 changed files
with
3,472 additions
and
1,715 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,9 @@ | ||
*.o | ||
gen_ft8 | ||
decode_ft8 | ||
test_ft8 | ||
libft8.a | ||
wsjtx2/ | ||
.build/ | ||
.DS_Store | ||
.vscode/ | ||
__pycache__/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,27 +1,49 @@ | ||
CFLAGS = -O3 -ggdb3 -fsanitize=address | ||
CPPFLAGS = -std=c11 -I. | ||
LDFLAGS = -lm -fsanitize=address | ||
BUILD_DIR = .build | ||
|
||
TARGETS = gen_ft8 decode_ft8 test | ||
FT8_SRC = $(wildcard ft8/*.c) | ||
FT8_OBJ = $(patsubst %.c,$(BUILD_DIR)/%.o,$(FT8_SRC)) | ||
|
||
.PHONY: run_tests all clean | ||
COMMON_SRC = $(wildcard common/*.c) | ||
COMMON_OBJ = $(patsubst %.c,$(BUILD_DIR)/%.o,$(COMMON_SRC)) | ||
|
||
all: $(TARGETS) | ||
FFT_SRC = $(wildcard fft/*.c) | ||
FFT_OBJ = $(patsubst %.c,$(BUILD_DIR)/%.o,$(FFT_SRC)) | ||
|
||
TARGETS = gen_ft8 decode_ft8 test_ft8 | ||
|
||
run_tests: test | ||
@./test | ||
CFLAGS = -fsanitize=address -O3 -ggdb3 | ||
CPPFLAGS = -std=c11 -I. | ||
LDFLAGS = -fsanitize=address -lm | ||
|
||
gen_ft8: gen_ft8.o ft8/constants.o ft8/text.o ft8/pack.o ft8/encode.o ft8/crc.o common/wave.o | ||
$(CXX) $(LDFLAGS) -o $@ $^ | ||
# Optionally, use Portaudio for live audio input | ||
ifdef PORTAUDIO_PREFIX | ||
CPPFLAGS += -DUSE_PORTAUDIO -I$(PORTAUDIO_PREFIX)/include | ||
LDFLAGS += -lportaudio -L$(PORTAUDIO_PREFIX)/lib | ||
endif | ||
|
||
test: test.o ft8/pack.o ft8/encode.o ft8/crc.o ft8/text.o ft8/constants.o fft/kiss_fftr.o fft/kiss_fft.o | ||
$(CXX) $(LDFLAGS) -o $@ $^ | ||
.PHONY: all clean run_tests install | ||
|
||
decode_ft8: decode_ft8.o fft/kiss_fftr.o fft/kiss_fft.o ft8/decode.o ft8/encode.o ft8/crc.o ft8/ldpc.o ft8/unpack.o ft8/text.o ft8/constants.o common/wave.o | ||
$(CXX) $(LDFLAGS) -o $@ $^ | ||
all: $(TARGETS) | ||
|
||
clean: | ||
rm -f *.o ft8/*.o common/*.o fft/*.o $(TARGETS) | ||
rm -rf $(BUILD_DIR) $(TARGETS) | ||
|
||
run_tests: test_ft8 | ||
@./test_ft8 | ||
|
||
install: | ||
$(AR) rc libft8.a ft8/constants.o ft8/encode.o ft8/pack.o ft8/text.o common/wave.o | ||
$(AR) rc libft8.a $(FT8_OBJ) $(COMMON_OBJ) | ||
install libft8.a /usr/lib/libft8.a | ||
|
||
gen_ft8: $(BUILD_DIR)/demo/gen_ft8.o $(FT8_OBJ) $(COMMON_OBJ) $(FFT_OBJ) | ||
$(CC) $(LDFLAGS) -o $@ $^ | ||
|
||
decode_ft8: $(BUILD_DIR)/demo/decode_ft8.o $(FT8_OBJ) $(COMMON_OBJ) $(FFT_OBJ) | ||
$(CC) $(LDFLAGS) -o $@ $^ | ||
|
||
test_ft8: $(BUILD_DIR)/test/test.o $(FT8_OBJ) | ||
$(CC) $(LDFLAGS) -o $@ $^ | ||
|
||
$(BUILD_DIR)/%.o: %.c | ||
@mkdir -p $(dir $@) | ||
$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ -c $^ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,191 @@ | ||
#include "audio.h" | ||
|
||
#include <stdio.h> | ||
#include <string.h> | ||
|
||
#ifdef USE_PORTAUDIO | ||
#include <portaudio.h> | ||
|
||
typedef struct | ||
{ | ||
PaStream* instream; | ||
} audio_context_t; | ||
|
||
static audio_context_t audio_context; | ||
|
||
static int audio_cb(void* inputBuffer, void* outputBuffer, unsigned long framesPerBuffer, | ||
const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags, void* userData) | ||
{ | ||
audio_context_t* context = (audio_context_t*)userData; | ||
float* samples_in = (float*)inputBuffer; | ||
|
||
// PaTime time = data->startTime + timeInfo->inputBufferAdcTime; | ||
printf("Callback with %ld samples\n", framesPerBuffer); | ||
return 0; | ||
} | ||
|
||
void audio_list(void) | ||
{ | ||
PaError pa_rc; | ||
|
||
pa_rc = Pa_Initialize(); // Initialize PortAudio | ||
if (pa_rc != paNoError) | ||
{ | ||
printf("Error initializing PortAudio.\n"); | ||
printf("\tErrortext: %s\n\tNumber: %d\n", Pa_GetErrorText(pa_rc), pa_rc); | ||
return; | ||
} | ||
|
||
int numDevices; | ||
numDevices = Pa_GetDeviceCount(); | ||
if (numDevices < 0) | ||
{ | ||
printf("ERROR: Pa_CountDevices returned 0x%x\n", numDevices); | ||
return; | ||
} | ||
|
||
printf("%d audio devices found:\n", numDevices); | ||
for (int i = 0; i < numDevices; i++) | ||
{ | ||
const PaDeviceInfo* deviceInfo = Pa_GetDeviceInfo(i); | ||
|
||
PaStreamParameters inputParameters = { | ||
.device = i, | ||
.channelCount = 1, // 1 = mono, 2 = stereo | ||
.sampleFormat = paFloat32, | ||
.suggestedLatency = 0.2, | ||
.hostApiSpecificStreamInfo = NULL | ||
}; | ||
double sample_rate = 12000; // sample rate (frames per second) | ||
pa_rc = Pa_IsFormatSupported(&inputParameters, NULL, sample_rate); | ||
|
||
printf("%d: [%s] [%s]\n", (i + 1), deviceInfo->name, (pa_rc == paNoError) ? "OK" : "NOT SUPPORTED"); | ||
} | ||
} | ||
|
||
int audio_init(void) | ||
{ | ||
PaError pa_rc; | ||
|
||
pa_rc = Pa_Initialize(); // Initialize PortAudio | ||
if (pa_rc != paNoError) | ||
{ | ||
printf("Error initializing PortAudio.\n"); | ||
printf("\tErrortext: %s\n\tNumber: %d\n", Pa_GetErrorText(pa_rc), pa_rc); | ||
Pa_Terminate(); // I don't think we need this but... | ||
return -1; | ||
} | ||
return 0; | ||
} | ||
|
||
int audio_open(const char* name) | ||
{ | ||
PaError pa_rc; | ||
audio_context.instream = NULL; | ||
|
||
PaDeviceIndex ndevice_in = -1; | ||
int numDevices = Pa_GetDeviceCount(); | ||
for (int i = 0; i < numDevices; i++) | ||
{ | ||
const PaDeviceInfo* deviceInfo = Pa_GetDeviceInfo(i); | ||
if (0 == strcmp(deviceInfo->name, name)) | ||
{ | ||
ndevice_in = i; | ||
break; | ||
} | ||
} | ||
|
||
if (ndevice_in < 0) | ||
{ | ||
printf("Could not find device [%s].\n", name); | ||
audio_list(); | ||
return -1; | ||
} | ||
|
||
unsigned long nfpb = 1920 / 4; // frames per buffer | ||
double sample_rate = 12000; // sample rate (frames per second) | ||
|
||
PaStreamParameters inputParameters = { | ||
.device = ndevice_in, | ||
.channelCount = 1, // 1 = mono, 2 = stereo | ||
.sampleFormat = paFloat32, | ||
.suggestedLatency = 0.2, | ||
.hostApiSpecificStreamInfo = NULL | ||
}; | ||
|
||
// Test if this configuration actually works, so we do not run into an ugly assertion | ||
pa_rc = Pa_IsFormatSupported(&inputParameters, NULL, sample_rate); | ||
if (pa_rc != paNoError) | ||
{ | ||
printf("Error opening input audio stream.\n"); | ||
printf("\tErrortext: %s\n\tNumber: %d\n", Pa_GetErrorText(pa_rc), pa_rc); | ||
return -2; | ||
} | ||
|
||
PaStream* instream; | ||
pa_rc = Pa_OpenStream( | ||
&instream, // address of stream | ||
&inputParameters, | ||
NULL, | ||
sample_rate, // Sample rate | ||
nfpb, // Frames per buffer | ||
paNoFlag, | ||
NULL /*(PaStreamCallback*)audio_cb*/, // Callback routine | ||
NULL /*(void*)&audio_context*/); // address of data structure | ||
if (pa_rc != paNoError) | ||
{ // We should have no error here usually | ||
printf("Error opening input audio stream:\n"); | ||
printf("\tErrortext: %s\n\tNumber: %d\n", Pa_GetErrorText(pa_rc), pa_rc); | ||
return -3; | ||
} | ||
// printf("Successfully opened audio input.\n"); | ||
|
||
pa_rc = Pa_StartStream(instream); // Start input stream | ||
if (pa_rc != paNoError) | ||
{ | ||
printf("Error starting input audio stream!\n"); | ||
printf("\tErrortext: %s\n\tNumber: %d\n", Pa_GetErrorText(pa_rc), pa_rc); | ||
return -4; | ||
} | ||
|
||
audio_context.instream = instream; | ||
|
||
// while (Pa_IsStreamActive(instream)) | ||
// { | ||
// Pa_Sleep(100); | ||
// } | ||
// Pa_AbortStream(instream); // Abort stream | ||
// Pa_CloseStream(instream); // Close stream, we're done. | ||
|
||
return 0; | ||
} | ||
|
||
int audio_read(float* buffer, int num_samples) | ||
{ | ||
PaError pa_rc; | ||
pa_rc = Pa_ReadStream(audio_context.instream, (void*)buffer, num_samples); | ||
return 0; | ||
} | ||
|
||
#else | ||
|
||
int audio_init(void) | ||
{ | ||
return -1; | ||
} | ||
|
||
void audio_list(void) | ||
{ | ||
} | ||
|
||
int audio_open(const char* name) | ||
{ | ||
return -1; | ||
} | ||
|
||
int audio_read(float* buffer, int num_samples) | ||
{ | ||
return -1; | ||
} | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
#ifndef _INCLUDE_AUDIO_H_ | ||
#define _INCLUDE_AUDIO_H_ | ||
|
||
#ifdef __cplusplus | ||
extern "C" | ||
{ | ||
#endif | ||
|
||
int audio_init(void); | ||
void audio_list(void); | ||
int audio_open(const char* name); | ||
int audio_read(float* buffer, int num_samples); | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif // _INCLUDE_AUDIO_H_ |
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.