/* udp_recv.c
 * UDP Babyphone Empfaenger (Lautsprecher)
 * Andre Adrian
 */

#include "udp_common.h"

int main(void)
{
  struct sockaddr_in local;   // UDP Empfaenger IPv4 Adress und Port Struktur
  int localfd;                // UDP Empfaenger Filedeskriptor
  struct sockaddr_in remote;  // UDP Sender IPv4 Adress und Port Struktur
  int len;
  int rv;
  int fd, i;
  char buffer[BUFSIZE];
 
  localfd = socket(AF_INET, SOCK_DGRAM, 0); // Socket Filedeskriptor anlegen
  exit_if(localfd < 0);

  memset(&local, 0, sizeof(local)); // local mit 0 vollschreiben
  local.sin_family = AF_INET; 
  local.sin_port = htons(BABYPHONE_PORT);
  local.sin_addr.s_addr = INADDR_ANY;

  // local Server IPv4 Adresse eintragen
  rv = bind(localfd, (struct sockaddr *) &local, sizeof(local));
  exit_if(rv < 0);

  fd = open("/dev/dsp", O_WRONLY);          // Soundcard oeffnen
  exit_if(fd < 0);
  
  // Anzahl und Groesse der Audio-Buffers im Soundcard Treiber setzen
  i = AUDIOBUFS << 16 | BUFSIZELD;
  rv = ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &i);
  exit_if(rv < 0);
  
  i = AUDIOFORMAT;                          // Audio Codec (Format) setzen
  rv = ioctl(fd, SNDCTL_DSP_SETFMT, &i);
  exit_if(rv < 0);
  
  i = AUDIOCHANNELS;                        // Mono oder Stereo setzen
  rv = ioctl(fd, SNDCTL_DSP_CHANNELS, &i);
  exit_if(rv < 0);

  i = AUDIOSPEED;                           // Abtastfrequenz setzen     
  rv = ioctl(fd, SNDCTL_DSP_SPEED, &i);
  exit_if(rv < 0);

  for (;;) {                                // Endlosschleife
    socklen_t addr_len = sizeof(remote);
    
    len = recvfrom(localfd, buffer, sizeof(buffer), 0,
                    (struct sockaddr *) &remote, &addr_len);
    exit_if(len < 0);
                
    rv = write(fd, buffer, len);                
    exit_if(rv != len);
  }
  
  // hierhin kommt das Programm garnicht..
  close(fd);
  close(localfd);

  return 0;
}
