diff options
| -rw-r--r-- | src/display.c | 16 | ||||
| -rw-r--r-- | src/listener.c | 15 | ||||
| -rw-r--r-- | src/socket.c | 18 | ||||
| -rw-r--r-- | src/socket.h | 6 | ||||
| -rw-r--r-- | src/talker.c | 17 | ||||
| -rw-r--r-- | src/typedef.h | 24 | 
6 files changed, 57 insertions, 39 deletions
| diff --git a/src/display.c b/src/display.c index ba9bc48..fa3d573 100644 --- a/src/display.c +++ b/src/display.c @@ -17,19 +17,19 @@ static void key_callback(GLFWwindow* window, int key, int scancode, int action,  }  extern unsigned char cam_data[]; +extern unsigned int WIDTH; +extern unsigned int HEIGHT; -unsigned char WIDTH = 1; -unsigned char HEIGHT = 1;  GLubyte pixels[BUF_CAP] = {0}; -void pixel(int x, int y, char *buf) +void pixel(int x, int y)  {      // for rotating the screen      int p = (y*WIDTH + x)*3;      int b = ((HEIGHT-1-y)*WIDTH+x)*3; -    pixels[p+0] = buf[b+0]; -    pixels[p+1] = buf[b+1]; -    pixels[p+2] = buf[b+2]; +    pixels[p+0] = cam_data[b+0]; +    pixels[p+1] = cam_data[b+1]; +    pixels[p+2] = cam_data[b+2];  }  int display(void) @@ -56,13 +56,11 @@ int display(void)      while (!glfwWindowShouldClose(window))      { -        WIDTH = MAX(cam_data[0], 1); -        HEIGHT = MAX(cam_data[1], 1);          glfwSetWindowSize(window, WIDTH, HEIGHT);          for(int i = 0; i < HEIGHT; i++)              for(int j = 0; j < WIDTH; j++) -                pixel(j, i, &(cam_data[2])); +                pixel(j, i);          glClear(GL_COLOR_BUFFER_BIT);          glDrawPixels(WIDTH, HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, pixels); diff --git a/src/listener.c b/src/listener.c index b344b6e..f819383 100644 --- a/src/listener.c +++ b/src/listener.c @@ -10,7 +10,9 @@  #include "audio.h"  #include "typedef.h" -char cam_data[BUF_CAP]; +char cam_data[BUF_CAP] = {0}; +unsigned int WIDTH = 1; +unsigned int HEIGHT = 1;  void *display_thread(void *arg)  { @@ -24,18 +26,17 @@ void *display_thread(void *arg)      exit(r);  } -void on_recv(char *buf, int numbytes) +void on_recv(message *m)  { -    (void)numbytes; +    WIDTH = m->WIDTH; +    HEIGHT = m->HEIGHT; -    memcpy(cam_data, &(buf[REC_CAP]), BUF_CAP-REC_CAP); -    audio_play(buf); +    memcpy(cam_data, m->video, WIDTH * HEIGHT * 3); +    audio_play(m->audio);  }  int main(void)  { -    memset(cam_data, 0, BUF_CAP); -      pthread_t tid;      pthread_create(&tid, NULL, display_thread, NULL); diff --git a/src/socket.c b/src/socket.c index 2ce4900..2efe53a 100644 --- a/src/socket.c +++ b/src/socket.c @@ -21,7 +21,7 @@ void *get_in_addr(struct sockaddr *sa)  	return &(((struct sockaddr_in6*)sa)->sin6_addr);  } -int listener(char *port, void (*on_recv)(char *, int)) +int listener(char *port, void (*on_recv)(message *))  {      int sockfd;      int ret; @@ -73,17 +73,18 @@ int listener(char *port, void (*on_recv)(char *, int))              i = 0;          } -        char buf[BUF_CAP] = {0}; +        message m = {0};          struct sockaddr_storage their_addr;          socklen_t addr_len = sizeof(their_addr);          int numbytes; -        if ((numbytes = recvfrom(sockfd, buf, BUF_CAP-1 , 0, +        if((numbytes = recvfrom(sockfd, &m, BUF_CAP, 0,                                   (struct sockaddr *)&their_addr, &addr_len)) == -1) {              perror("recvfrom");              return 1;          } +      #ifdef LOG_INFO_STDOUT          char s[INET6_ADDRSTRLEN];          info("listener: got packet from %s, %d bytes long\n", @@ -92,7 +93,7 @@ int listener(char *port, void (*on_recv)(char *, int))                           s, sizeof(s)), numbytes);      #endif -        on_recv(buf, numbytes); +        on_recv(&m);          i++;      } @@ -100,7 +101,7 @@ int listener(char *port, void (*on_recv)(char *, int))      return 0;  } -int talker(char *port, char *address, void (*on_send)(char *, int *)) +int talker(char *port, char *address, void (*on_send)(message *))  {      int sockfd; @@ -142,12 +143,11 @@ int talker(char *port, char *address, void (*on_send)(char *, int *))              i = 0;          } -        char buf[BUF_CAP] = {0}; -        int bytes; -        on_send(buf, &bytes); +        message m = {0}; +        on_send(&m);          int numbytes; -        if((numbytes = sendto(sockfd, buf, bytes, 0, +        if((numbytes = sendto(sockfd, &m, MESSAGE_SZ, 0,                                p->ai_addr, p->ai_addrlen)) == -1) {              perror("talker: sendto");              return 1; diff --git a/src/socket.h b/src/socket.h index ecb27ab..1868afc 100644 --- a/src/socket.h +++ b/src/socket.h @@ -1,8 +1,10 @@  #ifndef SOCKET_H  #define SOCKET_H -int listener(char *port, void (*on_recv)(char *, int)); +#include "typedef.h" -int talker(char *port, char *address, void (*on_send)(char *, int *)); +int listener(char *port, void (*on_recv)(message *)); + +int talker(char *port, char *address, void (*on_send)(message *));  #endif diff --git a/src/talker.c b/src/talker.c index bfea616..e7271ad 100644 --- a/src/talker.c +++ b/src/talker.c @@ -15,25 +15,22 @@  camera_handle cam_handle; -void on_send(char *buf, int *bytes) +void on_send(message *m)  { -    audio_record(buf); +    audio_record(m->audio); -    int image_sz = X_RES*Y_RES*3; -    buf[REC_CAP+0] = (unsigned char)X_RES; -    buf[REC_CAP+1] = (unsigned char)Y_RES; +    m->WIDTH = X_RES; +    m->HEIGHT = Y_RES; -    *bytes = REC_CAP + 2 + image_sz; - -    memcpy(&(buf[REC_CAP+2]), camera_get_image(&cam_handle), image_sz); +    memcpy(m->video, camera_get_image(&cam_handle), X_RES * Y_RES * 3);  }  int main(void)  {      camera_params params = {0};      params.device = CAM; -    params.x_res = 160; -    params.y_res = 120; +    params.x_res = X_RES; +    params.y_res = Y_RES;      camera_init(&cam_handle, params); diff --git a/src/typedef.h b/src/typedef.h index c585f7a..b6b2b29 100644 --- a/src/typedef.h +++ b/src/typedef.h @@ -12,7 +12,27 @@  #define info(...) fprintf(stdout, __GREEN__"[INFO]"__RESET__" "__FILE__":"stringize(__LINE__)": "__VA_ARGS__)  #define err(...) fprintf(stderr, __RED__"[ERR]"__RESET__"  "__FILE__":"stringize(__LINE__)": "__VA_ARGS__) -#define BUF_CAP 65536 // max datagram size -#define REC_CAP 5880 // 30th of a second of audio +// ----- MESSAGE ----- // + +#define BUF_CAP 65500 // max datagram size with some bytes left for the headers and things + +#define FRAMES 32 +#define BITRATE 16 +#define SAMPLING_RATE 44100 +#define CHANNELS 2 + +#define TEMP_BUF_SZ (FRAMES * CHANNELS * 2) // 2 bytes per sample +#define REC_CAP ((BITRATE * SAMPLING_RATE * CHANNELS)/240) // 30th of a second of audio + +#define VID_CAP (BUF_CAP - ((2*(sizeof(int))) + REC_CAP)) + +typedef struct message { +    char audio[REC_CAP]; +    unsigned int WIDTH; +    unsigned int HEIGHT; +    char video[VID_CAP]; +} message; + +#define MESSAGE_SZ sizeof(message)  #endif | 
