Pass on rtpmap to raop_buffer in order to add AAC support later
[deb_shairplay.git] / src / lib / raop_rtp.c
index 77814ba08680528e9a2d96b9ee9d42d40792d16a..e80da78d0d1ee3bc86c2712c377e5e66420a23d7 100644 (file)
@@ -45,6 +45,7 @@ struct raop_rtp_s {
        int joined;
 
        float volume;
+       int volume_changed;
        unsigned char *metadata;
        int metadata_len;
        unsigned char *coverart;
@@ -120,13 +121,15 @@ raop_rtp_parse_remote(raop_rtp_t *raop_rtp, const char *remote)
 
 raop_rtp_t *
 raop_rtp_init(logger_t *logger, raop_callbacks_t *callbacks, const char *remote,
-              const char *fmtp, const unsigned char *aeskey, const unsigned char *aesiv)
+              const char *rtpmap, const char *fmtp,
+              const unsigned char *aeskey, const unsigned char *aesiv)
 {
        raop_rtp_t *raop_rtp;
 
        assert(logger);
        assert(callbacks);
        assert(remote);
+       assert(rtpmap);
        assert(fmtp);
 
        raop_rtp = calloc(1, sizeof(raop_rtp_t));
@@ -135,7 +138,7 @@ raop_rtp_init(logger_t *logger, raop_callbacks_t *callbacks, const char *remote,
        }
        raop_rtp->logger = logger;
        memcpy(&raop_rtp->callbacks, callbacks, sizeof(raop_callbacks_t));
-       raop_rtp->buffer = raop_buffer_init(fmtp, aeskey, aesiv);
+       raop_rtp->buffer = raop_buffer_init(rtpmap, fmtp, aeskey, aesiv);
        if (!raop_rtp->buffer) {
                free(raop_rtp);
                return NULL;
@@ -246,9 +249,10 @@ raop_rtp_resend_callback(void *opaque, unsigned short seqnum, unsigned short cou
 }
 
 static int
-raop_rtp_process_events(raop_rtp_t *raop_rtp, void *cb_data, float *volume)
+raop_rtp_process_events(raop_rtp_t *raop_rtp, void *cb_data)
 {
        int flush;
+       float volume;
        int volume_changed;
        unsigned char *metadata;
        int metadata_len;
@@ -256,7 +260,6 @@ raop_rtp_process_events(raop_rtp_t *raop_rtp, void *cb_data, float *volume)
        int coverart_len;
 
        assert(raop_rtp);
-       assert(volume);
 
        MUTEX_LOCK(raop_rtp->run_mutex);
        if (!raop_rtp->running) {
@@ -265,8 +268,9 @@ raop_rtp_process_events(raop_rtp_t *raop_rtp, void *cb_data, float *volume)
        }
 
        /* Read the volume level */
-       volume_changed = (*volume != raop_rtp->volume);
-       *volume = raop_rtp->volume;
+       volume = raop_rtp->volume;
+       volume_changed = raop_rtp->volume_changed;
+       raop_rtp->volume_changed = 0;
 
        /* Read the flush value */
        flush = raop_rtp->flush;
@@ -288,7 +292,7 @@ raop_rtp_process_events(raop_rtp_t *raop_rtp, void *cb_data, float *volume)
        /* Call set_volume callback if changed */
        if (volume_changed) {
                if (raop_rtp->callbacks.audio_set_volume) {
-                       raop_rtp->callbacks.audio_set_volume(raop_rtp->callbacks.cls, cb_data, *volume);
+                       raop_rtp->callbacks.audio_set_volume(raop_rtp->callbacks.cls, cb_data, volume);
                }
        }
 
@@ -324,7 +328,6 @@ raop_rtp_thread_udp(void *arg)
        unsigned int packetlen;
        struct sockaddr_storage saddr;
        socklen_t saddrlen;
-       float volume = 0.0;
 
        const ALACSpecificConfig *config;
        void *cb_data = NULL;
@@ -343,7 +346,7 @@ raop_rtp_thread_udp(void *arg)
                int nfds, ret;
 
                /* Check if we are still running and process callbacks */
-               if (raop_rtp_process_events(raop_rtp, cb_data, &volume)) {
+               if (raop_rtp_process_events(raop_rtp, cb_data)) {
                        break;
                }
 
@@ -432,7 +435,6 @@ raop_rtp_thread_tcp(void *arg)
        int stream_fd = -1;
        unsigned char packet[RAOP_PACKET_LEN];
        unsigned int packetlen = 0;
-       float volume = 0.0;
 
        const ALACSpecificConfig *config;
        void *cb_data = NULL;
@@ -451,7 +453,7 @@ raop_rtp_thread_tcp(void *arg)
                int nfds, ret;
 
                /* Check if we are still running and process callbacks */
-               if (raop_rtp_process_events(raop_rtp, cb_data, &volume)) {
+               if (raop_rtp_process_events(raop_rtp, cb_data)) {
                        break;
                }
 
@@ -606,6 +608,7 @@ raop_rtp_set_volume(raop_rtp_t *raop_rtp, float volume)
        /* Set volume in thread instead */
        MUTEX_LOCK(raop_rtp->run_mutex);
        raop_rtp->volume = volume;
+       raop_rtp->volume_changed = 1;
        MUTEX_UNLOCK(raop_rtp->run_mutex);
 }