debug(1, "Cannot get the dB range from the volume control \"%s\"", alsa_mix_ctrl);
}
-
-
/*
debug(1, "Min and max volumes are %d and
%d.",alsa_mix_minv,alsa_mix_maxv);
#include "dbus_service.h"
void notify_loudness_filter_active_callback(ShairportSync *skeleton, gpointer user_data) {
- debug(1,"\"notify_loudness_filter_active_callback\" called.");
- if (shairport_sync_get_loudness_filter_active (skeleton)) {
- debug(1,"activating loudness filter");
+ debug(1, "\"notify_loudness_filter_active_callback\" called.");
+ if (shairport_sync_get_loudness_filter_active(skeleton)) {
+ debug(1, "activating loudness filter");
config.loudness = 1;
} else {
- debug(1,"deactivating loudness filter");
+ debug(1, "deactivating loudness filter");
config.loudness = 0;
}
}
void notify_loudness_threshold_callback(ShairportSync *skeleton, gpointer user_data) {
- gdouble th = shairport_sync_get_loudness_threshold (skeleton);
+ gdouble th = shairport_sync_get_loudness_threshold(skeleton);
if ((th <= 0.0) && (th >= -100.0)) {
- debug(1,"Setting loudness threshhold to %f.",th);
+ debug(1, "Setting loudness threshhold to %f.", th);
config.loudness_reference_volume_db = th;
} else {
- debug(1,"Invalid loudness threshhold: %f. Ignored.",th);
+ debug(1, "Invalid loudness threshhold: %f. Ignored.", th);
}
}
void notify_volume_callback(ShairportSync *skeleton, gpointer user_data) {
- gdouble vo = shairport_sync_get_volume (skeleton);
+ gdouble vo = shairport_sync_get_volume(skeleton);
if (((vo <= 0.0) && (vo >= -30.0)) || (vo == -144.0)) {
- debug(1,"Setting volume to %f.",vo);
+ debug(1, "Setting volume to %f.", vo);
if (playing_conn)
- player_volume_without_notification(vo,playing_conn);
+ player_volume_without_notification(vo, playing_conn);
else
- debug(1,"no thread playing -- ignored.");
+ debug(1, "no thread playing -- ignored.");
} else {
- debug(1,"Invalid volume: %f -- ignored.",vo);
+ debug(1, "Invalid volume: %f -- ignored.", vo);
}
}
g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(skeleton), connection,
"/org/gnome/ShairportSync", NULL);
-
- shairport_sync_set_loudness_threshold(SHAIRPORT_SYNC(skeleton), config.loudness_reference_volume_db);
- debug(1,"Loudness threshold is %f.",config.loudness_reference_volume_db);
-
- if (config.loudness==0) {
+
+ shairport_sync_set_loudness_threshold(SHAIRPORT_SYNC(skeleton),
+ config.loudness_reference_volume_db);
+ debug(1, "Loudness threshold is %f.", config.loudness_reference_volume_db);
+
+ if (config.loudness == 0) {
shairport_sync_set_loudness_filter_active(SHAIRPORT_SYNC(skeleton), FALSE);
- debug(1,"Loudness is off");
+ debug(1, "Loudness is off");
} else {
shairport_sync_set_loudness_filter_active(SHAIRPORT_SYNC(skeleton), TRUE);
- debug(1,"Loudness is on");
+ debug(1, "Loudness is on");
}
-
- g_signal_connect(skeleton, "notify::loudness-filter-active", G_CALLBACK(notify_loudness_filter_active_callback), NULL);
- g_signal_connect(skeleton, "notify::loudness-threshold", G_CALLBACK(notify_loudness_threshold_callback), NULL);
- g_signal_connect(skeleton, "notify::volume", G_CALLBACK(notify_volume_callback), NULL);
+ g_signal_connect(skeleton, "notify::loudness-filter-active",
+ G_CALLBACK(notify_loudness_filter_active_callback), NULL);
+ g_signal_connect(skeleton, "notify::loudness-threshold",
+ G_CALLBACK(notify_loudness_threshold_callback), NULL);
+ g_signal_connect(skeleton, "notify::volume", G_CALLBACK(notify_volume_callback), NULL);
}
int start_dbus_service() {
GMainLoop *loop;
-void on_properties_changed (GDBusProxy *proxy,
- GVariant *changed_properties,
- const gchar* const *invalidated_properties,
- gpointer user_data)
-{
+void on_properties_changed(GDBusProxy *proxy, GVariant *changed_properties,
+ const gchar *const *invalidated_properties, gpointer user_data) {
/* Note that we are guaranteed that changed_properties and
* invalidated_properties are never NULL
*/
- if (g_variant_n_children (changed_properties) > 0)
- {
- GVariantIter *iter;
- const gchar *key;
- GVariant *value;
-
- g_print (" *** Properties Changed:\n");
- g_variant_get (changed_properties,
- "a{sv}",
- &iter);
- while (g_variant_iter_loop (iter, "{&sv}", &key, &value))
- {
- gchar *value_str;
- value_str = g_variant_print (value, TRUE);
- g_print (" %s -> %s\n", key, value_str);
- g_free (value_str);
- }
- g_variant_iter_free (iter);
+ if (g_variant_n_children(changed_properties) > 0) {
+ GVariantIter *iter;
+ const gchar *key;
+ GVariant *value;
+
+ g_print(" *** Properties Changed:\n");
+ g_variant_get(changed_properties, "a{sv}", &iter);
+ while (g_variant_iter_loop(iter, "{&sv}", &key, &value)) {
+ gchar *value_str;
+ value_str = g_variant_print(value, TRUE);
+ g_print(" %s -> %s\n", key, value_str);
+ g_free(value_str);
}
-
- if (g_strv_length ((GStrv) invalidated_properties) > 0)
- {
- guint n;
- g_print (" *** Properties Invalidated:\n");
- for (n = 0; invalidated_properties[n] != NULL; n++)
- {
- const gchar *key = invalidated_properties[n];
- g_print (" %s\n", key);
- }
+ g_variant_iter_free(iter);
+ }
+
+ if (g_strv_length((GStrv)invalidated_properties) > 0) {
+ guint n;
+ g_print(" *** Properties Invalidated:\n");
+ for (n = 0; invalidated_properties[n] != NULL; n++) {
+ const gchar *key = invalidated_properties[n];
+ g_print(" %s\n", key);
}
+ }
}
-
void notify_loudness_filter_active_callback(ShairportSync *proxy, gpointer user_data) {
-// printf("\"notify_loudness_filter_active_callback\" called with a gpointer of %lx.\n",(int64_t)user_data);
- gboolean ebl = shairport_sync_get_loudness_filter_active (proxy);
+ // printf("\"notify_loudness_filter_active_callback\" called with a gpointer of
+ // %lx.\n",(int64_t)user_data);
+ gboolean ebl = shairport_sync_get_loudness_filter_active(proxy);
if (ebl == TRUE)
printf("Client reports loudness is enabled.\n");
else
}
void notify_loudness_threshold_callback(ShairportSync *proxy, gpointer user_data) {
- gdouble th = shairport_sync_get_loudness_threshold (proxy);
- printf("Client reports loudness threshold set to %.2f dB.\n",th);
+ gdouble th = shairport_sync_get_loudness_threshold(proxy);
+ printf("Client reports loudness threshold set to %.2f dB.\n", th);
}
void notify_volume_callback(ShairportSync *proxy, gpointer user_data) {
- gdouble th = shairport_sync_get_volume (proxy);
- printf("Client reports volume set to %.2f dB.\n",th);
+ gdouble th = shairport_sync_get_volume(proxy);
+ printf("Client reports volume set to %.2f dB.\n", th);
}
pthread_t dbus_thread;
void *dbus_thread_func(void *arg) {
loop = g_main_loop_new(NULL, FALSE);
-
+
g_main_loop_run(loop);
-// dbus_service_main(); // let it run inside a thread
+ // dbus_service_main(); // let it run inside a thread
}
-
void main(void) {
pthread_create(&dbus_thread, NULL, &dbus_thread_func, NULL);
GError *error = NULL;
proxy = shairport_sync_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE,
- "org.gnome.ShairportSync", "/org/gnome/ShairportSync", NULL, &error);
-
+ "org.gnome.ShairportSync",
+ "/org/gnome/ShairportSync", NULL, &error);
+ // g_signal_connect(proxy, "notify::loudness-filter-active",
+ // G_CALLBACK(notify_loudness_filter_active_callback), NULL);
- // g_signal_connect(proxy, "notify::loudness-filter-active", G_CALLBACK(notify_loudness_filter_active_callback), NULL);
-
- g_signal_connect (proxy,
- "g-properties-changed",
- G_CALLBACK (on_properties_changed),
- NULL);
- g_signal_connect(proxy, "notify::loudness-threshold", G_CALLBACK(notify_loudness_threshold_callback), NULL);
+ g_signal_connect(proxy, "g-properties-changed", G_CALLBACK(on_properties_changed), NULL);
+ g_signal_connect(proxy, "notify::loudness-threshold",
+ G_CALLBACK(notify_loudness_threshold_callback), NULL);
g_signal_connect(proxy, "notify::volume", G_CALLBACK(notify_volume_callback), NULL);
g_print("Starting test...\n");
-
+
shairport_sync_set_volume(SHAIRPORT_SYNC(proxy), -20.0);
sleep(10);
shairport_sync_set_volume(SHAIRPORT_SYNC(proxy), -10.0);
sleep(15);
g_print("Finished test...\n");
g_main_loop_quit(loop);
- pthread_join(dbus_thread,NULL);
+ pthread_join(dbus_thread, NULL);
printf("exiting program.\n");
-
+
g_object_unref(proxy);
}
}
}
-void mdns_dacp_monitor(char* dacp_id,uint16_t *port,void** private_pointer) {
+void mdns_dacp_monitor(char *dacp_id, uint16_t *port, void **private_pointer) {
if ((config.mdns) && (config.mdns->mdns_dacp_monitor)) {
- int error = config.mdns->mdns_dacp_monitor(dacp_id,port,private_pointer);
+ int error = config.mdns->mdns_dacp_monitor(dacp_id, port, private_pointer);
if (error) {
- debug(1,"Error starting a DACP monitor.");
+ debug(1, "Error starting a DACP monitor.");
}
} else
- debug(1,"Can't start a DACP monitor.");
+ debug(1, "Can't start a DACP monitor.");
}
-void mdns_dacp_dont_monitor(void** private_pointer) {
+void mdns_dacp_dont_monitor(void **private_pointer) {
if ((config.mdns) && (config.mdns->mdns_dacp_dont_monitor)) {
config.mdns->mdns_dacp_dont_monitor(private_pointer);
} else
- debug(1,"Can't stop a DACP monitor.");
+ debug(1, "Can't stop a DACP monitor.");
}
void mdns_ls_backends(void) {
mdns_backend **b = NULL;
#ifndef _MDNS_H
#define _MDNS_H
-#include <stdint.h>
#include "config.h"
+#include <stdint.h>
extern int mdns_pid;
void mdns_unregister(void);
void mdns_register(void);
-void mdns_dacp_monitor(char* dacp_id,uint16_t *port,void** private_pointer);
-void mdns_dacp_dont_monitor(void** private_pointer);
+void mdns_dacp_monitor(char *dacp_id, uint16_t *port, void **private_pointer);
+void mdns_dacp_dont_monitor(void **private_pointer);
void mdns_ls_backends(void);
char *name;
int (*mdns_register)(char *apname, int port);
void (*mdns_unregister)(void);
- int (*mdns_dacp_monitor)(char* dacp_id,uint16_t *port,void** private_pointer);
- void (*mdns_dacp_dont_monitor)(void** private_pointer);
+ int (*mdns_dacp_monitor)(char *dacp_id, uint16_t *port, void **private_pointer);
+ void (*mdns_dacp_dont_monitor)(void **private_pointer);
} mdns_backend;
#ifdef CONFIG_METADATA
* OTHER DEALINGS IN THE SOFTWARE.
*/
-#include <stdlib.h>
#include <pthread.h>
+#include <stdlib.h>
#include "common.h"
#include "mdns.h"
#include <avahi-client/lookup.h>
#include <avahi-common/alternative.h>
-
typedef struct {
- AvahiThreadedPoll *service_poll;
- AvahiClient *service_client;
- AvahiServiceBrowser *service_browser;
- char *dacp_id;
- uint16_t *dacp_port;
+ AvahiThreadedPoll *service_poll;
+ AvahiClient *service_client;
+ AvahiServiceBrowser *service_browser;
+ char *dacp_id;
+ uint16_t *dacp_port;
} dacp_browser_struct;
-//static AvahiServiceBrowser *sb = NULL;
+// static AvahiServiceBrowser *sb = NULL;
static AvahiClient *client = NULL;
// static AvahiClient *service_client = NULL;
static AvahiEntryGroup *group = NULL;
static char *service_name = NULL;
static int port = 0;
-static void resolve_callback(
- AvahiServiceResolver *r,
- AVAHI_GCC_UNUSED AvahiIfIndex interface,
- AVAHI_GCC_UNUSED AvahiProtocol protocol,
- AvahiResolverEvent event,
- const char *name,
- const char *type,
- const char *domain,
- const char *host_name,
- const AvahiAddress *address,
- uint16_t port,
- AvahiStringList *txt,
- AvahiLookupResultFlags flags,
- void* userdata) {
- assert(r);
-
- dacp_browser_struct *dbs = (dacp_browser_struct *)userdata;
-
- /* Called whenever a service has been resolved successfully or timed out */
- switch (event) {
- case AVAHI_RESOLVER_FAILURE:
- debug(1, "(Resolver) Failed to resolve service '%s' of type '%s' in domain '%s': %s.", name, type, domain, avahi_strerror(avahi_client_errno(avahi_service_resolver_get_client(r))));
- break;
- case AVAHI_RESOLVER_FOUND: {
- char a[AVAHI_ADDRESS_STR_MAX], *t;
- //debug(1, "Resolve callback: Service '%s' of type '%s' in domain '%s':", name, type, domain);
- char* dacpid = strstr(name,"iTunes_Ctrl_");
- if (dacpid) {
- dacpid+=strlen("iTunes_Ctrl_");
- if (strcmp(dacpid,dbs->dacp_id)==0) {
- uint16_t *p = dbs->dacp_port;
- if (*p != port) {
- debug(1,"Client's DACP port: %u.",port);
- *p = port;
- }
- }
- } else {
- debug(1,"Resolve callback: Can't see a DACP string in a DACP Record!");
- }
+static void resolve_callback(AvahiServiceResolver *r, AVAHI_GCC_UNUSED AvahiIfIndex interface,
+ AVAHI_GCC_UNUSED AvahiProtocol protocol, AvahiResolverEvent event,
+ const char *name, const char *type, const char *domain,
+ const char *host_name, const AvahiAddress *address, uint16_t port,
+ AvahiStringList *txt, AvahiLookupResultFlags flags, void *userdata) {
+ assert(r);
+
+ dacp_browser_struct *dbs = (dacp_browser_struct *)userdata;
+
+ /* Called whenever a service has been resolved successfully or timed out */
+ switch (event) {
+ case AVAHI_RESOLVER_FAILURE:
+ debug(1, "(Resolver) Failed to resolve service '%s' of type '%s' in domain '%s': %s.", name,
+ type, domain, avahi_strerror(avahi_client_errno(avahi_service_resolver_get_client(r))));
+ break;
+ case AVAHI_RESOLVER_FOUND: {
+ char a[AVAHI_ADDRESS_STR_MAX], *t;
+ // debug(1, "Resolve callback: Service '%s' of type '%s' in domain '%s':", name, type, domain);
+ char *dacpid = strstr(name, "iTunes_Ctrl_");
+ if (dacpid) {
+ dacpid += strlen("iTunes_Ctrl_");
+ if (strcmp(dacpid, dbs->dacp_id) == 0) {
+ uint16_t *p = dbs->dacp_port;
+ if (*p != port) {
+ debug(1, "Client's DACP port: %u.", port);
+ *p = port;
}
+ }
+ } else {
+ debug(1, "Resolve callback: Can't see a DACP string in a DACP Record!");
}
- avahi_service_resolver_free(r);
+ }
+ }
+ avahi_service_resolver_free(r);
}
-static void browse_callback(
- AvahiServiceBrowser *b,
- AvahiIfIndex interface,
- AvahiProtocol protocol,
- AvahiBrowserEvent event,
- const char *name,
- const char *type,
- const char *domain,
- AVAHI_GCC_UNUSED AvahiLookupResultFlags flags,
- void* userdata) {
- dacp_browser_struct *dbs = (dacp_browser_struct *)userdata;
- assert(b);
- /* Called whenever a new services becomes available on the LAN or is removed from the LAN */
- switch (event) {
- case AVAHI_BROWSER_FAILURE:
- warn("avahi: browser failure.", avahi_strerror(avahi_client_errno(avahi_service_browser_get_client(b))));
- avahi_threaded_poll_quit(tpoll);
- break;
- case AVAHI_BROWSER_NEW:
- // debug(1, "(Browser) NEW: service '%s' of type '%s' in domain '%s'.", name, type, domain);
- /* We ignore the returned resolver object. In the callback
- function we free it. If the server is terminated before
- the callback function is called the server will free
- the resolver for us. */
- if (!(avahi_service_resolver_new(dbs->service_client, interface, protocol, name, type, domain, AVAHI_PROTO_UNSPEC, 0, resolve_callback, userdata)))
- debug(1, "Failed to resolve service '%s': %s.", name, avahi_strerror(avahi_client_errno(dbs->service_client)));
- break;
- case AVAHI_BROWSER_REMOVE:
- debug(1, "(Browser) REMOVE: service '%s' of type '%s' in domain '%s'.", name, type, domain);
- char* dacpid = strstr(name,"iTunes_Ctrl_");
- if (dacpid) {
- dacpid+=strlen("iTunes_Ctrl_");
- if (strcmp(dacpid,dbs->dacp_id)==0) {
- uint16_t *p = dbs->dacp_port;
- if (*p != 0) {
- debug(1,"Client's DACP status withdrawn.");
- *p = 0;
- }
- }
- } else {
- debug(1,"Browse callback: Can't see a DACP string in a DACP Record!");
- }
-
- break;
- case AVAHI_BROWSER_ALL_FOR_NOW:
- case AVAHI_BROWSER_CACHE_EXHAUSTED:
- // debug(1, "(Browser) %s.", event == AVAHI_BROWSER_CACHE_EXHAUSTED ? "CACHE_EXHAUSTED" : "ALL_FOR_NOW");
- break;
+static void browse_callback(AvahiServiceBrowser *b, AvahiIfIndex interface, AvahiProtocol protocol,
+ AvahiBrowserEvent event, const char *name, const char *type,
+ const char *domain, AVAHI_GCC_UNUSED AvahiLookupResultFlags flags,
+ void *userdata) {
+ dacp_browser_struct *dbs = (dacp_browser_struct *)userdata;
+ assert(b);
+ /* Called whenever a new services becomes available on the LAN or is removed from the LAN */
+ switch (event) {
+ case AVAHI_BROWSER_FAILURE:
+ warn("avahi: browser failure.",
+ avahi_strerror(avahi_client_errno(avahi_service_browser_get_client(b))));
+ avahi_threaded_poll_quit(tpoll);
+ break;
+ case AVAHI_BROWSER_NEW:
+ // debug(1, "(Browser) NEW: service '%s' of type '%s' in domain '%s'.", name, type, domain);
+ /* We ignore the returned resolver object. In the callback
+ function we free it. If the server is terminated before
+ the callback function is called the server will free
+ the resolver for us. */
+ if (!(avahi_service_resolver_new(dbs->service_client, interface, protocol, name, type, domain,
+ AVAHI_PROTO_UNSPEC, 0, resolve_callback, userdata)))
+ debug(1, "Failed to resolve service '%s': %s.", name,
+ avahi_strerror(avahi_client_errno(dbs->service_client)));
+ break;
+ case AVAHI_BROWSER_REMOVE:
+ debug(1, "(Browser) REMOVE: service '%s' of type '%s' in domain '%s'.", name, type, domain);
+ char *dacpid = strstr(name, "iTunes_Ctrl_");
+ if (dacpid) {
+ dacpid += strlen("iTunes_Ctrl_");
+ if (strcmp(dacpid, dbs->dacp_id) == 0) {
+ uint16_t *p = dbs->dacp_port;
+ if (*p != 0) {
+ debug(1, "Client's DACP status withdrawn.");
+ *p = 0;
+ }
+ }
+ } else {
+ debug(1, "Browse callback: Can't see a DACP string in a DACP Record!");
}
-}
+ break;
+ case AVAHI_BROWSER_ALL_FOR_NOW:
+ case AVAHI_BROWSER_CACHE_EXHAUSTED:
+ // debug(1, "(Browser) %s.", event == AVAHI_BROWSER_CACHE_EXHAUSTED ? "CACHE_EXHAUSTED" :
+ // "ALL_FOR_NOW");
+ break;
+ }
+}
static void register_service(AvahiClient *c);
selected_interface = AVAHI_IF_UNSPEC;
#ifdef CONFIG_METADATA
if (config.metadata_enabled) {
- ret = avahi_entry_group_add_service(group, selected_interface, AVAHI_PROTO_UNSPEC, 0, service_name,
- config.regtype, NULL, NULL, port,
+ ret = avahi_entry_group_add_service(group, selected_interface, AVAHI_PROTO_UNSPEC, 0,
+ service_name, config.regtype, NULL, NULL, port,
MDNS_RECORD_WITH_METADATA, NULL);
if (ret == 0)
debug(1, "avahi: request to add \"%s\" service with metadata", config.regtype);
} else {
#endif
- ret = avahi_entry_group_add_service(group, selected_interface, AVAHI_PROTO_UNSPEC, 0, service_name,
- config.regtype, NULL, NULL, port,
+ ret = avahi_entry_group_add_service(group, selected_interface, AVAHI_PROTO_UNSPEC, 0,
+ service_name, config.regtype, NULL, NULL, port,
MDNS_RECORD_WITHOUT_METADATA, NULL);
if (ret == 0)
debug(1, "avahi: request to add \"%s\" service without metadata", config.regtype);
}
}
-static void service_client_callback(AvahiClient *c, AvahiClientState state,
- void *userdata) {
+static void service_client_callback(AvahiClient *c, AvahiClientState state, void *userdata) {
int err;
-
+
dacp_browser_struct *dbs = (dacp_browser_struct *)userdata;
switch (state) {
avahi_client_free(c);
c = NULL;
- if (!(dbs->service_client = avahi_client_new(avahi_threaded_poll_get(dbs->service_poll), AVAHI_CLIENT_NO_FAIL,
- service_client_callback, userdata, &err))) {
+ if (!(dbs->service_client =
+ avahi_client_new(avahi_threaded_poll_get(dbs->service_poll), AVAHI_CLIENT_NO_FAIL,
+ service_client_callback, userdata, &err))) {
warn("avahi: failed to create service client object: %s", avahi_strerror(err));
avahi_threaded_poll_quit(dbs->service_poll);
}
break;
case AVAHI_CLIENT_S_COLLISION:
- debug(2, "avahi: service client state is AVAHI_CLIENT_S_COLLISION...needs a rename: %s", service_name);
+ debug(2, "avahi: service client state is AVAHI_CLIENT_S_COLLISION...needs a rename: %s",
+ service_name);
break;
case AVAHI_CLIENT_CONNECTING:
service_name = NULL;
}
-int avahi_dacp_monitor(char* dacp_id,uint16_t *port,void** private_pointer) {
-
- dacp_browser_struct **pdbs = (dacp_browser_struct **)private_pointer;
-
- dacp_browser_struct *dbs = (dacp_browser_struct*)malloc(sizeof(dacp_browser_struct));
-
- if (dbs==NULL)
- die("can not allocate a dacp_browser_struct.");
+int avahi_dacp_monitor(char *dacp_id, uint16_t *port, void **private_pointer) {
+
+ dacp_browser_struct **pdbs = (dacp_browser_struct **)private_pointer;
+
+ dacp_browser_struct *dbs = (dacp_browser_struct *)malloc(sizeof(dacp_browser_struct));
+
+ if (dbs == NULL)
+ die("can not allocate a dacp_browser_struct.");
- dbs->dacp_id=dacp_id;
- dbs->dacp_port=port;
-
+ dbs->dacp_id = dacp_id;
+ dbs->dacp_port = port;
- // create the threaded poll code
+ // create the threaded poll code
int err;
if (!(dbs->service_poll = avahi_threaded_poll_new())) {
warn("couldn't create avahi threaded service_poll!");
- if(dbs) {
- free((char*)dbs);
+ if (dbs) {
+ free((char *)dbs);
}
return -1;
- }
+ }
- // create the service client
- if (!(dbs->service_client = avahi_client_new(avahi_threaded_poll_get(dbs->service_poll), AVAHI_CLIENT_NO_FAIL,
- service_client_callback, (void*)dbs, &err))) {
+ // create the service client
+ if (!(dbs->service_client =
+ avahi_client_new(avahi_threaded_poll_get(dbs->service_poll), AVAHI_CLIENT_NO_FAIL,
+ service_client_callback, (void *)dbs, &err))) {
warn("couldn't create avahi service client: %s!", avahi_strerror(err));
- if(dbs) { //should free the threaded poll code
- avahi_threaded_poll_free(dbs->service_poll);
- free((char*)dbs);
+ if (dbs) { // should free the threaded poll code
+ avahi_threaded_poll_free(dbs->service_poll);
+ free((char *)dbs);
}
return -1;
}
/* Create the service browser */
- if (!(dbs->service_browser = avahi_service_browser_new(dbs->service_client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_dacp._tcp", NULL, 0, browse_callback, (void *)dbs))) {
- warn("Failed to create service browser: %s\n", avahi_strerror(avahi_client_errno(dbs->service_client)));
- if(dbs) { //should free the threaded poll code and the service client
- avahi_client_free(dbs->service_client);
- avahi_threaded_poll_free(dbs->service_poll);
- free((char*)dbs);
+ if (!(dbs->service_browser =
+ avahi_service_browser_new(dbs->service_client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
+ "_dacp._tcp", NULL, 0, browse_callback, (void *)dbs))) {
+ warn("Failed to create service browser: %s\n",
+ avahi_strerror(avahi_client_errno(dbs->service_client)));
+ if (dbs) { // should free the threaded poll code and the service client
+ avahi_client_free(dbs->service_client);
+ avahi_threaded_poll_free(dbs->service_poll);
+ free((char *)dbs);
}
- return -1;
- }
- // start the polling thread
+ return -1;
+ }
+ // start the polling thread
if (avahi_threaded_poll_start(dbs->service_poll) < 0) {
warn("couldn't start avahi service_poll thread");
- if(dbs) { //should free the threaded poll code and the service client and the service browser
- avahi_service_browser_free(dbs->service_browser);
- avahi_client_free(dbs->service_client);
- avahi_threaded_poll_free(dbs->service_poll);
- free((char*)dbs);
+ if (dbs) { // should free the threaded poll code and the service client and the service browser
+ avahi_service_browser_free(dbs->service_browser);
+ avahi_client_free(dbs->service_client);
+ avahi_threaded_poll_free(dbs->service_poll);
+ free((char *)dbs);
}
return -1;
}
- *pdbs = dbs;
+ *pdbs = dbs;
return 0;
-
}
-void avahi_dacp_dont_monitor(void** private_pointer) {
- dacp_browser_struct **pdbs = (dacp_browser_struct **)private_pointer;
-
- // stop and dispose of everything
- if ((*pdbs)->service_poll)
- avahi_threaded_poll_stop((*pdbs)->service_poll);
- if ((*pdbs)->service_browser)
- avahi_service_browser_free((*pdbs)->service_browser);
- if ((*pdbs)->service_client)
- avahi_client_free((*pdbs)->service_client);
- if ((*pdbs)->service_poll)
- avahi_threaded_poll_free((*pdbs)->service_poll);
- free((char*)(*pdbs));
- *pdbs = NULL;
+void avahi_dacp_dont_monitor(void **private_pointer) {
+ dacp_browser_struct **pdbs = (dacp_browser_struct **)private_pointer;
+
+ // stop and dispose of everything
+ if ((*pdbs)->service_poll)
+ avahi_threaded_poll_stop((*pdbs)->service_poll);
+ if ((*pdbs)->service_browser)
+ avahi_service_browser_free((*pdbs)->service_browser);
+ if ((*pdbs)->service_client)
+ avahi_client_free((*pdbs)->service_client);
+ if ((*pdbs)->service_poll)
+ avahi_threaded_poll_free((*pdbs)->service_poll);
+ free((char *)(*pdbs));
+ *pdbs = NULL;
}
-mdns_backend mdns_avahi = {
- .name = "avahi",
- .mdns_register = avahi_register,
- .mdns_unregister = avahi_unregister,
- .mdns_dacp_monitor = avahi_dacp_monitor,
- .mdns_dacp_dont_monitor = avahi_dacp_dont_monitor
-};
+mdns_backend mdns_avahi = {.name = "avahi",
+ .mdns_register = avahi_register,
+ .mdns_unregister = avahi_unregister,
+ .mdns_dacp_monitor = avahi_dacp_monitor,
+ .mdns_dacp_dont_monitor = avahi_dacp_dont_monitor};
// as a null operand, so we'll use it like that too
int sync_error_out_of_bounds =
0; // number of times in a row that there's been a serious sync error
-
- // start an mdns/zeroconf thread to look for DACP messages containing our DACP_ID and getting the port number
- mdns_dacp_monitor(conn->dacp_id,&conn->dacp_port,&conn->dacp_private);
+
+ // start an mdns/zeroconf thread to look for DACP messages containing our DACP_ID and getting the
+ // port number
+ mdns_dacp_monitor(conn->dacp_id, &conn->dacp_port, &conn->dacp_private);
conn->framesProcessedInThisEpoch = 0;
conn->framesGeneratedInThisEpoch = 0;
elapsedSec);
}
- // stop watching for DACP port number stuff
- mdns_dacp_dont_monitor(&conn->dacp_private); // begin looking out for information about the client as a remote control. Specifically we might need the port number
+ // stop watching for DACP port number stuff
+ mdns_dacp_dont_monitor(&conn->dacp_private); // begin looking out for information about the client
+ // as a remote control. Specifically we might need
+ // the port number
if (config.output->stop)
config.output->stop();
usleep(100000); // allow this time to (?) allow the alsa subsystem to finish cleaning up after
// itself. 50 ms seems too short
-
debug(2, "Shut down audio, control and timing threads");
conn->please_stop = 1;
pthread_kill(rtp_audio_thread, SIGUSR1);
debug(1, "Error destroying vol_mutex variable.");
debug(1, "Player thread exit on RTSP conversation thread %d.", conn->connection_number);
- if (conn->dacp_id) {
- free(conn->dacp_id);
- conn->dacp_id = NULL;
- }
+ if (conn->dacp_id) {
+ free(conn->dacp_id);
+ conn->dacp_id = NULL;
+ }
if (outbuf)
free(outbuf);
if (silence)
// Thus, we ask our vol2attn function for an appropriate dB between -96.3 and 0 dB and translate
// it back to a number.
-
int32_t hw_min_db, hw_max_db, hw_range_db, range_to_use, min_db,
max_db; // hw_range_db is a flag; if 0 means no mixer
}
void player_volume(double airplay_volume, rtsp_conn_info *conn) {
- command_set_volume(airplay_volume);
- #ifdef HAVE_DBUS
+ command_set_volume(airplay_volume);
+#ifdef HAVE_DBUS
shairport_sync_set_volume(SHAIRPORT_SYNC(skeleton), airplay_volume);
- #endif
+#endif
player_volume_without_notification(airplay_volume, conn);
}
int64_t session_corrections;
int play_number_after_flush;
-
- // remote control stuff. The port to which to send commands is not specified, so you have to use mdns to find it.
+
+ // remote control stuff. The port to which to send commands is not specified, so you have to use
+ // mdns to find it.
// at present, only avahi can do this
-
- char* dacp_id; // id of the client -- used to find the port to be used
- uint16_t dacp_port; // port on the client to send remote control messages to, else zero
+
+ char *dacp_id; // id of the client -- used to find the port to be used
+ uint16_t dacp_port; // port on the client to send remote control messages to, else zero
uint32_t dacp_active_remote; // key to send to the remote controller
- void* dacp_private; // private storage (just a pointer) for the dacp_port resolver
+ void *dacp_private; // private storage (just a pointer) for the dacp_port resolver
} rtsp_conn_info;
return sport;
}
-void rtp_setup(SOCKADDR *local, SOCKADDR *remote, int cport, int tport,
- int *lsport, int *lcport, int *ltport, rtsp_conn_info *conn) {
+void rtp_setup(SOCKADDR *local, SOCKADDR *remote, int cport, int tport, int *lsport, int *lcport,
+ int *ltport, rtsp_conn_info *conn) {
// this gets the local and remote ip numbers (and ports used for the TCD stuff)
// we use the local stuff to specify the address we are coming from and
void *rtp_timing_receiver(void *arg);
void rtp_setup(SOCKADDR *local, SOCKADDR *remote, int controlport, int timingport,
- int *local_server_port, int *local_control_port,
- int *local_timing_port, rtsp_conn_info *conn);
+ int *local_server_port, int *local_control_port, int *local_timing_port,
+ rtsp_conn_info *conn);
void rtp_request_resend(seq_t first, uint32_t count, rtsp_conn_info *conn);
void rtp_request_client_pause(rtsp_conn_info *conn); // ask the client to pause
tport = atoi(p);
// rtsp_take_player();
- rtp_setup(&conn->local, &conn->remote, cport, tport, &lsport, &lcport, <port,
- conn);
+ rtp_setup(&conn->local, &conn->remote, cport, tport, &lsport, &lcport, <port, conn);
if (!lsport)
goto error;
char *q;
int *sockfd = NULL;
int nsock = 0;
int i, ret;
-
+
playing_conn = NULL; // the data structure representing the connection that has the player.
memset(&hints, 0, sizeof(hints));
return optind + 1;
}
-#if defined(HAVE_DBUS) || defined (HAVE_MPRIS)
+#if defined(HAVE_DBUS) || defined(HAVE_MPRIS)
GMainLoop *loop;
pthread_t dbus_thread;
void *dbus_thread_func(void *arg) {
- loop = g_main_loop_new(NULL, FALSE);
+ loop = g_main_loop_new(NULL, FALSE);
g_main_loop_run(loop);
}
#endif
#if defined(HAVE_DBUS)
// Start up DBUS services after initial settings are all made
- debug(1,"Starting up D-Bus services");
- pthread_create(&dbus_thread, NULL, &dbus_thread_func, NULL);
- #ifdef HAVE_DBUS
- start_dbus_service();
- #endif
+ debug(1, "Starting up D-Bus services");
+ pthread_create(&dbus_thread, NULL, &dbus_thread_func, NULL);
+#ifdef HAVE_DBUS
+ start_dbus_service();
+#endif
#endif
daemon_log(LOG_INFO, "Successful Startup");