bool CAirTunesServer::Initialize(const std::string &password) { bool ret = false; Deinitialize(); if (m_pLibShairplay->Load()) { raop_callbacks_t ao = {}; ao.cls = m_pPipe; ao.audio_init = AudioOutputFunctions::audio_init; ao.audio_set_volume = AudioOutputFunctions::audio_set_volume; ao.audio_set_metadata = AudioOutputFunctions::audio_set_metadata; ao.audio_set_coverart = AudioOutputFunctions::audio_set_coverart; ao.audio_process = AudioOutputFunctions::audio_process; ao.audio_destroy = AudioOutputFunctions::audio_destroy; ao.audio_remote_control_id = AudioOutputFunctions::audio_remote_control_id; ao.audio_set_progress = AudioOutputFunctions::audio_set_progress; m_pLibShairplay->EnableDelayedUnload(false); m_pRaop = m_pLibShairplay->raop_init(1, &ao, RSA_KEY);//1 - we handle one client at a time max ret = m_pRaop != NULL; if(ret) { char macAdr[6]; unsigned short port = (unsigned short)m_port; m_pLibShairplay->raop_set_log_level(m_pRaop, RAOP_LOG_WARNING); if(g_advancedSettings.CanLogComponent(LOGAIRTUNES)) { m_pLibShairplay->raop_set_log_level(m_pRaop, RAOP_LOG_DEBUG); } m_pLibShairplay->raop_set_log_callback(m_pRaop, shairplay_log, NULL); CNetworkInterface *net = g_application.getNetwork().GetFirstConnectedInterface(); if (net) { net->GetMacAddressRaw(macAdr); } ret = m_pLibShairplay->raop_start(m_pRaop, &port, macAdr, 6, password.c_str()) >= 0; } } return ret; }
bool CAirTunesServer::Initialize(const CStdString &password) { bool ret = false; Deinitialize(); #if defined(HAVE_LIBSHAIRPLAY) if (m_pLibShairplay->Load()) { raop_callbacks_t ao; ao.cls = m_pPipe; ao.audio_init = AudioOutputFunctions::audio_init; ao.audio_set_volume = AudioOutputFunctions::audio_set_volume; ao.audio_set_metadata = AudioOutputFunctions::audio_set_metadata; ao.audio_set_coverart = AudioOutputFunctions::audio_set_coverart; ao.audio_process = AudioOutputFunctions::audio_process; ao.audio_flush = AudioOutputFunctions::audio_flush; ao.audio_destroy = AudioOutputFunctions::audio_destroy; m_pLibShairplay->EnableDelayedUnload(false); m_pRaop = m_pLibShairplay->raop_init(1, &ao, RSA_KEY);//1 - we handle one client at a time max ret = m_pRaop != NULL; if(ret) { char macAdr[6]; unsigned short port = (unsigned short)m_port; m_pLibShairplay->raop_set_log_level(m_pRaop, RAOP_LOG_WARNING); if(g_advancedSettings.m_logEnableAirtunes) { m_pLibShairplay->raop_set_log_level(m_pRaop, RAOP_LOG_DEBUG); } m_pLibShairplay->raop_set_log_callback(m_pRaop, shairplay_log, NULL); CNetworkInterface *net = g_application.getNetwork().GetFirstConnectedInterface(); if (net) { net->GetMacAddressRaw(macAdr); } ret = m_pLibShairplay->raop_start(m_pRaop, &port, macAdr, 6, password.c_str()) >= 0; } } #else int numArgs = 3; CStdString hwStr; CStdString pwStr; CStdString portStr; hwStr.Format("--mac=%s", m_macAddress.c_str()); pwStr.Format("--password=%s",password.c_str()); portStr.Format("--server_port=%d",m_port); if (!password.empty()) { numArgs++; } char *argv[] = { "--apname=XBMC", (char*) portStr.c_str(), (char*) hwStr.c_str(), (char *)pwStr.c_str(), NULL }; if (m_pLibShairport->Load()) { struct AudioOutput ao; ao.ao_initialize = AudioOutputFunctions::ao_initialize; ao.ao_play = AudioOutputFunctions::ao_play; ao.ao_default_driver_id = AudioOutputFunctions::ao_default_driver_id; ao.ao_open_live = AudioOutputFunctions::ao_open_live; ao.ao_close = AudioOutputFunctions::ao_close; ao.ao_append_option = AudioOutputFunctions::ao_append_option; ao.ao_free_options = AudioOutputFunctions::ao_free_options; ao.ao_get_option = AudioOutputFunctions::ao_get_option; #ifdef HAVE_STRUCT_AUDIOOUTPUT_AO_SET_METADATA ao.ao_set_metadata = AudioOutputFunctions::ao_set_metadata; ao.ao_set_metadata_coverart = AudioOutputFunctions::ao_set_metadata_coverart; #endif #if defined(SHAIRPORT_AUDIOOUTPUT_VERSION) #if SHAIRPORT_AUDIOOUTPUT_VERSION >= 2 ao.ao_set_volume = AudioOutputFunctions::ao_set_volume; #endif #endif struct printfPtr funcPtr; funcPtr.extprintf = shairport_log; m_pLibShairport->EnableDelayedUnload(false); m_pLibShairport->shairport_set_ao(&ao); m_pLibShairport->shairport_set_printf(&funcPtr); m_pLibShairport->shairport_main(numArgs, argv); ret = true; } #endif return ret; }