cleanup (?) of writing to airplay_video struct

This commit is contained in:
F. Duncanh
2025-12-09 13:34:51 -05:00
parent fdf741f46c
commit d4cd0b12f3
3 changed files with 79 additions and 62 deletions

View File

@@ -126,15 +126,62 @@ airplay_video_destroy(airplay_video_t *airplay_video) {
airplay_video = NULL; airplay_video = NULL;
} }
void set_apple_session_id(airplay_video_t *airplay_video, const char * apple_session_id) { void set_apple_session_id(airplay_video_t *airplay_video, const char * apple_session_id, size_t len) {
assert(apple_session_id && len == 36);
char *str = (char *) calloc(len + 1, sizeof(char));
strncpy(str, apple_session_id, len);
if (airplay_video->apple_session_id) { if (airplay_video->apple_session_id) {
free (airplay_video->apple_session_id); free(airplay_video->apple_session_id);
} }
assert(apple_session_id && strlen(apple_session_id) == 36); airplay_video->apple_session_id = str;
airplay_video->apple_session_id = (char *) calloc(strlen(apple_session_id) + 1, sizeof(char)); str = NULL;
memcpy(airplay_video->apple_session_id, apple_session_id, strlen(apple_session_id));
} }
void set_playback_uuid(airplay_video_t *airplay_video, const char *playback_uuid, size_t len) {
assert(playback_uuid && len == 36);
char *str = (char *) calloc(len + 1, sizeof(char));
strncpy(str, playback_uuid, len);
if (airplay_video->playback_uuid) {
free(airplay_video->playback_uuid);
}
airplay_video->playback_uuid = str;
str = NULL;
}
void set_uri_prefix(airplay_video_t *airplay_video, const char *uri_prefix, size_t len) {
assert(uri_prefix && len );
char *str = (char *) calloc(len + 1, sizeof(char));
strncpy(str, uri_prefix, len);
if (airplay_video->uri_prefix) {
free(airplay_video->uri_prefix);
}
airplay_video->uri_prefix = str;
str = NULL;
}
void set_language_name(airplay_video_t *airplay_video, const char *language_name, size_t len) {
assert(language_name && len );
char *str = (char *) calloc(len + 1, sizeof(char));
strncpy(str, language_name, len);
if (airplay_video->language_name) {
free(airplay_video->language_name);
}
airplay_video->language_name = str;
str = NULL;
}
void set_language_code(airplay_video_t *airplay_video, const char *language_code, size_t len) {
assert(language_code && len );
char *str = (char *) calloc(len + 1, sizeof(char));
strncpy(str, language_code, len);
if (airplay_video->language_code) {
free(airplay_video->language_code);
}
airplay_video->language_code = str;
str = NULL;
}
const char *get_apple_session_id(airplay_video_t *airplay_video) { const char *get_apple_session_id(airplay_video_t *airplay_video) {
if (!airplay_video || !airplay_video->apple_session_id) { if (!airplay_video || !airplay_video->apple_session_id) {
return NULL; return NULL;
@@ -165,48 +212,18 @@ void set_resume_position_seconds(airplay_video_t *airplay_video, float resume_po
airplay_video->resume_position_seconds = resume_position_seconds; airplay_video->resume_position_seconds = resume_position_seconds;
} }
void set_playback_uuid(airplay_video_t *airplay_video, const char *playback_uuid) {
if (airplay_video->playback_uuid) {
free (airplay_video->playback_uuid);
}
assert(playback_uuid && strlen(playback_uuid) == 36);
airplay_video->playback_uuid = (char *) calloc(strlen(playback_uuid) + 1, sizeof(char));
memcpy(airplay_video->playback_uuid, playback_uuid, strlen(playback_uuid));
}
const char *get_playback_uuid(airplay_video_t *airplay_video) { const char *get_playback_uuid(airplay_video_t *airplay_video) {
return (const char *) (!airplay_video ? NULL : airplay_video->playback_uuid); return (const char *) (!airplay_video ? NULL : airplay_video->playback_uuid);
} }
void set_uri_prefix(airplay_video_t *airplay_video, char *uri_prefix) {
if (airplay_video->uri_prefix) {
free (airplay_video->uri_prefix);
}
airplay_video->uri_prefix = uri_prefix;
}
const char *get_uri_prefix(airplay_video_t *airplay_video) { const char *get_uri_prefix(airplay_video_t *airplay_video) {
return (const char *) airplay_video->uri_prefix; return (const char *) airplay_video->uri_prefix;
} }
void set_language_name(airplay_video_t *airplay_video, char *language_name) {
if (airplay_video->language_name) {
free (airplay_video->language_name);
}
airplay_video->language_name = language_name;
}
const char *get_language_name(airplay_video_t *airplay_video) { const char *get_language_name(airplay_video_t *airplay_video) {
return (const char *)airplay_video->language_name; return (const char *)airplay_video->language_name;
} }
void set_language_code(airplay_video_t *airplay_video, char *language_code) {;
if (airplay_video->language_code) {
free (airplay_video->language_code);
}
airplay_video->language_code = language_code;
}
const char *get_language_code(airplay_video_t *airplay_video) { const char *get_language_code(airplay_video_t *airplay_video) {
return (const char *) airplay_video->language_code; return (const char *) airplay_video->language_code;
} }
@@ -418,14 +435,14 @@ char * select_master_playlist_language(airplay_video_t *airplay_video, char *mas
/* update stored language code, name if changed */ /* update stored language code, name if changed */
if (name != language_name) { /* compare addresses */ if (name != language_name) { /* compare addresses */
int len = strlen(name); size_t len = strlen(name);
char *new_language_name = (char *) calloc(len + 1, sizeof(char)); char *new_language_name = (char *) calloc(len + 1, sizeof(char));
memcpy(new_language_name, name, len); memcpy(new_language_name, name, len);
set_language_name(airplay_video, new_language_name); set_language_name(airplay_video, new_language_name, len);
len = strlen(code); len = strlen(code);
char *new_language_code = (char *) calloc(len + 1, sizeof(char)); char *new_language_code = (char *) calloc(len + 1, sizeof(char));
memcpy(new_language_code, code, len); memcpy(new_language_code, code, len);
set_language_code(airplay_video, new_language_code); set_language_code(airplay_video, new_language_code, len);
} }
int len = 0; int len = 0;

View File

@@ -17,30 +17,31 @@
#ifndef AIRPLAY_VIDEO_H #ifndef AIRPLAY_VIDEO_H
#define AIRPLAY_VIDEO_H #define AIRPLAY_VIDEO_H
#include <stddef.h>
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#include "raop.h" #include "raop.h"
#include "logger.h" #include "logger.h"
typedef struct airplay_video_s airplay_video_t; typedef struct airplay_video_s airplay_video_t;
typedef struct media_item_s media_item_t; typedef struct media_item_s media_item_t;
void set_apple_session_id(airplay_video_t *airplay_video, const char *apple_session_id); void set_apple_session_id(airplay_video_t *airplay_video, const char *apple_session_id, size_t len);
const char *get_apple_session_id(airplay_video_t *airplay_video); const char *get_apple_session_id(airplay_video_t *airplay_video);
void set_start_position_seconds(airplay_video_t *airplay_video, float start_position_seconds); void set_start_position_seconds(airplay_video_t *airplay_video, float start_position_seconds);
void set_resume_position_seconds(airplay_video_t *airplay_video, float resume_position_seconds); void set_resume_position_seconds(airplay_video_t *airplay_video, float resume_position_seconds);
float get_duration(airplay_video_t *airplay_video); float get_duration(airplay_video_t *airplay_video);
float get_start_position_seconds(airplay_video_t *airplay_video); float get_start_position_seconds(airplay_video_t *airplay_video);
float get_resume_position_seconds(airplay_video_t *airplay_video); float get_resume_position_seconds(airplay_video_t *airplay_video);
void set_playback_uuid(airplay_video_t *airplay_video, const char *playback_uuid); void set_playback_uuid(airplay_video_t *airplay_video, const char *playback_uuid, size_t len);
const char *get_playback_uuid(airplay_video_t *airplay_video); const char *get_playback_uuid(airplay_video_t *airplay_video);
void set_uri_prefix(airplay_video_t *airplay_video, char *uri_prefix); void set_uri_prefix(airplay_video_t *airplay_video, const char *uri_prefix, size_t len);
const char *get_uri_prefix(airplay_video_t *airplay_video); const char *get_uri_prefix(airplay_video_t *airplay_video);
char *get_uri_local_prefix(airplay_video_t *airplay_video); char *get_uri_local_prefix(airplay_video_t *airplay_video);
void set_language_code(airplay_video_t *airplay_video, char *language_code); void set_language_code(airplay_video_t *airplay_video, const char *language_code, size_t len);
const char *get_language_code(airplay_video_t *airplay_video); const char *get_language_code(airplay_video_t *airplay_video);
void set_language_name(airplay_video_t *airplay_video, char *language_name); void set_language_name(airplay_video_t *airplay_video, const char *language_name, size_t len);
const char *get_language_name(airplay_video_t *airplay_video); const char *get_language_name(airplay_video_t *airplay_video);
int get_next_FCUP_RequestID(airplay_video_t *airplay_video); int get_next_FCUP_RequestID(airplay_video_t *airplay_video);

View File

@@ -214,16 +214,14 @@ http_handler_set_property(raop_conn_t *conn,
} }
} }
plist_free (req_root_node); plist_free (req_root_node);
const char *lname = NULL, *lcode = NULL; if (language_code && language_name) {
if (language_code) { set_language_code(airplay_video, language_code, strlen(language_code));
set_language_code(airplay_video, language_code); set_language_name(airplay_video, language_name, strlen(language_name));
lcode = get_language_code(airplay_video); logger_log(conn->raop->logger, LOGGER_INFO, "stored language from MediaSelectionOptions: %s \"%s\"",
get_language_code(airplay_video), get_language_name(airplay_video));
} }
if (language_name) { plist_mem_free(language_name);
set_language_name(airplay_video, language_name); plist_mem_free(language_code);
lname = get_language_name(airplay_video);
}
logger_log(conn->raop->logger, LOGGER_INFO, "stored language from MediaSelectionOptions: %s \"%s\"", lcode, lname);
} else if (!strcmp(property, "reverseEndTime") || } else if (!strcmp(property, "reverseEndTime") ||
!strcmp(property, "forwardEndTime") || !strcmp(property, "forwardEndTime") ||
!strcmp(property, "actionAtItemEnd")) { !strcmp(property, "actionAtItemEnd")) {
@@ -745,7 +743,7 @@ http_handler_play(raop_conn_t *conn, http_request_t *request, http_response_t *r
printf("use: airplay_video[%d] %p %s %s\n", id, airplay_video, playback_uuid, get_playback_uuid(airplay_video)); printf("use: airplay_video[%d] %p %s %s\n", id, airplay_video, playback_uuid, get_playback_uuid(airplay_video));
airplay_video = conn->raop->airplay_video[id]; airplay_video = conn->raop->airplay_video[id];
assert(airplay_video); assert(airplay_video);
set_apple_session_id(airplay_video, apple_session_id); set_apple_session_id(airplay_video, apple_session_id, strlen(apple_session_id));
char * uri_local_prefix = get_uri_local_prefix(airplay_video); char * uri_local_prefix = get_uri_local_prefix(airplay_video);
conn->raop->callbacks.on_video_play(conn->raop->callbacks.cls, conn->raop->callbacks.on_video_play(conn->raop->callbacks.cls,
strcat(uri_local_prefix, "/master.m3u8"), strcat(uri_local_prefix, "/master.m3u8"),
@@ -789,7 +787,7 @@ http_handler_play(raop_conn_t *conn, http_request_t *request, http_response_t *r
airplay_video = airplay_video_init(conn->raop, conn->raop->port, conn->raop->lang); airplay_video = airplay_video_init(conn->raop, conn->raop->port, conn->raop->lang);
if (airplay_video) { if (airplay_video) {
set_playback_uuid(airplay_video, playback_uuid); set_playback_uuid(airplay_video, playback_uuid, strlen(playback_uuid));
plist_mem_free (playback_uuid); plist_mem_free (playback_uuid);
conn->raop->current_video = id; conn->raop->current_video = id;
conn->raop->airplay_video[id] = airplay_video; conn->raop->airplay_video[id] = airplay_video;
@@ -818,7 +816,7 @@ http_handler_play(raop_conn_t *conn, http_request_t *request, http_response_t *r
get_duration(conn->raop->airplay_video[i])); get_duration(conn->raop->airplay_video[i]));
} }
#endif #endif
set_apple_session_id(airplay_video, apple_session_id); set_apple_session_id(airplay_video, apple_session_id, strlen(apple_session_id));
plist_t req_content_location_node = plist_dict_get_item(req_root_node, "Content-Location"); plist_t req_content_location_node = plist_dict_get_item(req_root_node, "Content-Location");
if (!req_content_location_node) { if (!req_content_location_node) {
@@ -849,15 +847,16 @@ http_handler_play(raop_conn_t *conn, http_request_t *request, http_response_t *r
} }
set_start_position_seconds(airplay_video, (float) start_position_seconds); set_start_position_seconds(airplay_video, (float) start_position_seconds);
char *ptr = strstr(playback_location, "/master.m3u8"); if (!strstr(playback_location, "/master.m3u8")) {
if (!ptr) {
logger_log(conn->raop->logger, LOGGER_ERR, "Content-Location has unsupported form:\n%s\n", playback_location); logger_log(conn->raop->logger, LOGGER_ERR, "Content-Location has unsupported form:\n%s\n", playback_location);
goto play_error; goto play_error;
} else { } else {
int prefix_len = (int) (ptr - playback_location); char *uri_prefix = (char *) calloc(strlen(playback_location) + 1, sizeof(char));
char *uri_prefix = (char *) calloc(prefix_len + 1, sizeof(char)); strncpy(uri_prefix, playback_location, strlen(playback_location));
memcpy(uri_prefix, playback_location, prefix_len); char *ptr = strstr(uri_prefix, "/master.m3u8");
set_uri_prefix(airplay_video, uri_prefix); *ptr = '\0';
set_uri_prefix(airplay_video, uri_prefix, strlen(uri_prefix));
free (uri_prefix);
} }
set_next_media_uri_id(airplay_video, 0); set_next_media_uri_id(airplay_video, 0);
printf("FCUP REQUEST\n"); printf("FCUP REQUEST\n");