diff --git a/Makefile b/Makefile index e717214..b283cd5 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ -SRC = irmc.c sound.c +SRC = irmc.c OBJ = ${SRC:.c=.o} -LDFLAGS = -lm -lossaudio -CFLAGS = -Wall +LDFLAGS = -L/usr/local/lib -L/opt/local/lib -lm -lmorse +CFLAGS = -I/usr/local/include -I/opt/local/include -Wall INSTALLDIR = ${HOME}/bin all: options irmc diff --git a/irmc.c b/irmc.c index dee961c..cebd76a 100644 --- a/irmc.c +++ b/irmc.c @@ -11,10 +11,26 @@ #include #include #include -#include +#include +#ifdef __MACH__ +#define LIBOSS_INTERNAL +#include //will not be used for audio any more +#else +#include +#include +#include +#endif #include #include -#include "sound.h" +#include +#include +#include + +#ifdef __MACH__ +#include +#include +#endif + #define MAXDATASIZE 1024 // max number of bytes we can get at once @@ -73,7 +89,6 @@ long tx_timer = 0; #define TX_TIMEOUT 240.0 #define KEEPALIVE_CYCLE 100 -char soundcard[] = "/dev/audio"; long key_press_t1; long key_release_t1; int last_message = 0; @@ -83,6 +98,22 @@ char last_sender[16]; int translate = 0; int audio_status = 1; +/* portable time, as listed in https://gist.github.com/jbenet/1087739 */ +void current_utc_time(struct timespec *ts) { +#ifdef __MACH__ // OS X does not have clock_gettime, use clock_get_time + clock_serv_t cclock; + mach_timespec_t mts; + host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); + clock_get_time(cclock, &mts); + mach_port_deallocate(mach_task_self(), cclock); + ts->tv_sec = mts.tv_sec; + ts->tv_nsec = mts.tv_nsec; +#else + clock_gettime(CLOCK_REALTIME, ts); +#endif + +} + /* a better clock() in milliseconds */ long fastclock(void) @@ -90,7 +121,7 @@ fastclock(void) struct timespec t; long r; - clock_gettime(CLOCK_REALTIME, &t); + current_utc_time (&t); r = t.tv_sec * 1000; r = r + t.tv_nsec / 1000000; return r; @@ -221,12 +252,10 @@ commandmode(void) if((strncmp(cmd, "aon", 3)) == 0){ audio_status = 1; - fd_speaker = open_audio_device(soundcard, O_WRONLY); return 0; } if((strncmp(cmd, "aoff", 3)) == 0){ audio_status = 0; - close(fd_speaker); return 0; } printf("?\n"); @@ -278,7 +307,6 @@ int main(int argc, char *argv[]) char id[128]; char serialport[64]; - if (argc < 4) { fprintf(stderr," %i usage: irmc [hostname] [port] [channel] [id] [serialport]\n", argc); exit(1); @@ -354,7 +382,7 @@ int main(int argc, char *argv[]) inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr), s, sizeof s); printf("irmc: connected to %s\n", s); - fd_speaker = open_audio_device(soundcard, O_WRONLY); + beep_init(); fd_serial = open(serialport, O_RDWR | O_NOCTTY | O_NDELAY); if(fd_serial == -1) { printf("irmc: unable to open serial port.\n"); @@ -362,7 +390,6 @@ int main(int argc, char *argv[]) freeaddrinfo(servinfo); /* all done with this structure */ key_release_t1 = fastclock(); - init_sound(); identifyclient(); /* Main Loop */ @@ -397,8 +424,23 @@ int main(int argc, char *argv[]) message(4); break; default: - if(audio_status == 1) - play_code_element (rx_data_packet.code[i]); + if(audio_status == 1) + { + +int length = rx_data_packet.code[i]; +if(length == 0 || abs(length) > 2000) { +} +else +{ +if(length < 0) { +beep(0.0, abs(length)/1000.); +} +else +{ +beep(1000.0, length/1000.); +} +} + } break; } } @@ -442,7 +484,6 @@ int main(int argc, char *argv[]) send(fd_socket, &disconnect_packet, sizeof(disconnect_packet), 0); close(fd_socket); - close(fd_speaker); close(fd_serial); exit(0);