add ask2ft
This commit is contained in:
68
ask2ft.c
Normal file
68
ask2ft.c
Normal file
@@ -0,0 +1,68 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
struct __attribute__((__packed__)) ft {
|
||||
double frequency;
|
||||
uint32_t duration;
|
||||
uint32_t padding;
|
||||
};
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
// arguments: freq samplerate samples/bit
|
||||
|
||||
if(argc < 4) {
|
||||
fprintf(stderr, "Error: set arguments: freq samplerate samples/bit\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int frequency = atoi(argv[1]);
|
||||
int samplerate = atoi(argv[2]);
|
||||
int samples = atoi(argv[3]);
|
||||
|
||||
fprintf(stderr, "Frequency: %d, Samplerate: %d, Samples/bit: %d\n", frequency, samplerate, samples);
|
||||
|
||||
freopen(NULL, "wb", stdout); // ft is a binary format
|
||||
|
||||
size_t ilen = 64;
|
||||
char* input = calloc(ilen, sizeof(char));
|
||||
for(size_t ch = 0; (input[ch] = getc(stdin)) != EOF && input[ch] != '\n'; ch++) {
|
||||
if(ch == ilen -1) {
|
||||
ilen *= 2;
|
||||
input = realloc(input, sizeof(char)*ilen);
|
||||
}
|
||||
}
|
||||
|
||||
const char binary[16][5] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
|
||||
const char digits[] = "0123456789abcdef";
|
||||
char* bininput = calloc(strlen(input)*4+1, sizeof(char));
|
||||
|
||||
size_t bi = 0;
|
||||
while(input[bi]) {
|
||||
char *v = strchr(digits, tolower(input[bi++]));
|
||||
if(v) strcat(bininput, binary[v - digits]);
|
||||
}
|
||||
|
||||
size_t i = 0;
|
||||
char prevchar = 0;
|
||||
size_t prevcharcount = 0;
|
||||
while(bininput[i]) {
|
||||
if((prevchar != bininput[i]) && (i > 0)) {
|
||||
struct ft* ftchunk = calloc(1, sizeof(struct ft));
|
||||
if(prevchar == '1') ftchunk->frequency = (double)frequency;
|
||||
ftchunk->duration = (uint64_t)prevcharcount*samples*1000000000/samplerate;
|
||||
fwrite(ftchunk, sizeof(struct ft), 1, stdout);
|
||||
fprintf(stderr, "Writing chunk: %f %u\n", ftchunk->frequency, ftchunk->duration);
|
||||
free(ftchunk);
|
||||
prevcharcount = 0;
|
||||
}
|
||||
prevchar = bininput[i++];
|
||||
prevcharcount++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user