Advertisement
Guest User

sender.c

a guest
Sep 17th, 2013
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.37 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <stdbool.h>
  4. #include <sys/types.h>
  5. #include <sys/wait.h>
  6. #include <sys/stat.h>
  7. #include <sys/prctl.h>
  8. #include <sys/signalfd.h>
  9. #include <sys/timerfd.h>
  10. #include <sys/time.h>
  11. #include <fcntl.h>
  12. #include <unistd.h>
  13. #include <string.h>
  14. #include <syslog.h>
  15.  
  16. #include <ortp/ortp.h>
  17. #include <mediastreamer2/mscommon.h>
  18. #include <mediastreamer2/mssndcard.h>
  19. #include <mediastreamer2/msfilter.h>
  20. #include <mediastreamer2/msrtp.h>
  21. #include <mediastreamer2/msticker.h>
  22.  
  23. void on_ssrc_changed(RtpSession *session, ...)
  24. {
  25. //        printf ("%s\n", __func__);
  26.         rtp_session_reset(session);
  27. }
  28.  
  29. void on_payload_type_changed (RtpSession *session, ...) { (void) session; /* printf ("%s\n", __func__); */ }
  30. void on_network_error        (RtpSession *session, ...) { (void) session; /* printf ("%s\n", __func__); */ }
  31. void on_timestamp_jump       (RtpSession *session, ...) { (void) session; /* printf ("%s\n", __func__); */ }
  32.  
  33. static RtpSession *rtp_init(const char *addr, const int port, const char *sendaddr)
  34. {
  35.         RtpSession *rtpsession;
  36.         char *ssrc;
  37.         int rc;
  38.  
  39.         ortp_init();
  40.         ortp_scheduler_init();
  41.         //ortp_set_log_level_mask(ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR);
  42.         ortp_set_log_level_mask(ORTP_DEBUG|ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR);
  43.         rtpsession=rtp_session_new(RTP_SESSION_SENDONLY);
  44.  
  45.         printf("Jitter compensation was %s\n",
  46.                         rtp_session_adaptive_jitter_compensation_enabled (rtpsession)?
  47.                         "ON":"OFF");
  48.         rtp_session_enable_adaptive_jitter_compensation (rtpsession, true);
  49.  
  50.         rc = rtp_session_signal_connect (rtpsession , "ssrc_changed"         , (RtpCallback) on_ssrc_changed         , 0);
  51.         if (rc < 0) {
  52.                 printf ("rtp_session_signal_connect failed %s:%d\n", __func__, __LINE__);
  53.         }
  54.         rc = rtp_session_signal_connect (rtpsession , "payload_type_changed" , (RtpCallback) on_payload_type_changed , 0);
  55.         if (rc < 0) {
  56.                 printf ("rtp_session_signal_connect failed %s:%d\n", __func__, __LINE__);
  57.         }
  58.         rc = rtp_session_signal_connect (rtpsession , "network_error"        , (RtpCallback) on_network_error        , 0);
  59.         if (rc < 0) {
  60.                 printf ("rtp_session_signal_connect failed %s:%d\n", __func__, __LINE__);
  61.         }
  62.         rc = rtp_session_signal_connect (rtpsession , "timestamp_jump"       , (RtpCallback) on_timestamp_jump       , 0);
  63.         if (rc < 0) {
  64.                 printf ("rtp_session_signal_connect failed %s:%d\n", __func__, __LINE__);
  65.         }
  66.  
  67.         rtp_session_set_scheduling_mode(rtpsession,1);
  68.         rtp_session_set_blocking_mode(rtpsession,1);
  69.         rtp_session_set_connected_mode(rtpsession,FALSE);
  70.         rtp_session_set_multicast_loopback(rtpsession,TRUE);
  71.         rtp_session_set_multicast_ttl(rtpsession,15);
  72.         rtp_session_set_ssrc_changed_threshold(rtpsession, 1);
  73.  
  74.         if (sendaddr) {
  75.                 rtp_session_set_remote_addr(rtpsession,sendaddr,port);
  76.         }
  77.         rtp_session_set_local_addr(rtpsession,addr,port);
  78.         rtp_session_set_payload_type(rtpsession,0);
  79.  
  80.         ssrc=getenv("SSRC");
  81.         if (ssrc!=NULL) {
  82.                 printf("using SSRC=%i.\n",atoi(ssrc));
  83.                 rtp_session_set_ssrc(rtpsession,atoi(ssrc));
  84.         }
  85.  
  86.         return rtpsession;
  87. }
  88.  
  89.  
  90. static void rtp_exit(RtpSession *rtpsession)
  91. {
  92.         rtp_session_destroy(rtpsession);
  93.         ortp_exit();
  94.         ortp_global_stats_display();
  95. }
  96.  
  97. int main(int argc, char **argv)
  98. {
  99.     const char *alsacard = argv[1];
  100.     const char *addr = "239.0.0.1";
  101.     const char *sendaddr = "239.0.0.1";
  102.     int         port = atoi(argv[2]);
  103.     int sr = 8000;
  104.     char *enc = "PCMU";
  105.  
  106.     ms_init();
  107.  
  108.     RtpSession *rtpsession = rtp_init ( addr, port, sendaddr);
  109.     MSSndCard *card=ms_alsa_card_new_custom(alsacard,alsacard);
  110.     ms_snd_card_manager_add_card(ms_snd_card_manager_get(),card);
  111.  
  112.     /* audio capture filter */
  113.     MSFilter *soundread=ms_snd_card_create_reader(card);
  114.  
  115.     MSFilter *encoder=ms_filter_create_encoder(enc);
  116.     if (!encoder) {
  117.             ms_error ("Cannot find encoder");
  118.             exit(1);
  119.     }
  120.  
  121.     MSFilter *rtpsend=ms_filter_new(MS_RTP_SEND_ID);
  122.  
  123.     ms_filter_call_method(rtpsend,MS_RTP_SEND_SET_SESSION,rtpsession);
  124.  
  125.     int chan=1;
  126.     ms_filter_call_method(soundread,MS_FILTER_SET_SAMPLE_RATE,&sr);
  127.     ms_filter_call_method(encoder,MS_FILTER_SET_SAMPLE_RATE,&sr);
  128.  
  129.     int br = 16 * sr;
  130.     int br2 = 8 * sr;
  131.     ms_filter_call_method(soundread,MS_FILTER_SET_BITRATE,&br);
  132.     ms_filter_call_method(encoder,MS_FILTER_SET_BITRATE,&br2);
  133.  
  134.     ms_filter_call_method(soundread,MS_FILTER_SET_NCHANNELS, &chan);
  135.  
  136.     ms_filter_link(soundread,0,encoder,0);
  137.     ms_filter_link(encoder,0,rtpsend,0);
  138.  
  139.     /* create ticker */
  140.     MSTicker *ticker=ms_ticker_new();
  141.  
  142.     ms_ticker_attach(ticker,soundread);
  143.  
  144.  
  145.     /*********** MAIN LOOP *************/
  146.     while (1) {
  147.         sleep(1);
  148.     }
  149.  
  150.     ms_ticker_detach(ticker, soundread);
  151.     ms_ticker_destroy(ticker);
  152.  
  153.     ms_filter_unlink(soundread,0,encoder,0);
  154.     ms_filter_unlink(rtpsend,0,encoder,0);
  155.  
  156.     ms_filter_destroy(encoder);
  157.     ms_filter_destroy(soundread);
  158.     ms_filter_destroy(rtpsend);
  159.  
  160.     // Deallocate resources
  161.     rtp_exit (rtpsession);
  162.  
  163.     return 0;
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement