void* CAirTunesServer::AudioOutputFunctions::audio_init(void *cls, int bits, int channels, int samplerate) { XFILE::CPipeFile *pipe=(XFILE::CPipeFile *)cls; const CURL pathToUrl(XFILE::PipesManager::GetInstance().GetUniquePipeName()); pipe->OpenForWrite(pathToUrl); pipe->SetOpenThreashold(300); Demux_BXA_FmtHeader header; strncpy(header.fourcc, "BXA ", 4); header.type = BXA_PACKET_TYPE_FMT_DEMUX; header.bitsPerSample = bits; header.channels = channels; header.sampleRate = samplerate; header.durationMs = 0; if (pipe->Write(&header, sizeof(header)) == 0) return 0; ThreadMessage tMsg = { TMSG_MEDIA_STOP }; CApplicationMessenger::Get().SendMessage(tMsg, true); CFileItem item; item.SetPath(pipe->GetName()); item.SetMimeType("audio/x-xbmc-pcm"); m_streamStarted = true; CApplicationMessenger::Get().PlayFile(item); // Not all airplay streams will provide metadata (e.g. if using mirroring, // no metadata will be sent). If there *is* metadata, it will be received // in a later call to audio_set_metadata/audio_set_coverart. ResetMetadata(); return session;//session }
void* CAirTunesServer::AudioOutputFunctions::audio_init(void *cls, int bits, int channels, int samplerate) { XFILE::CPipeFile *pipe=(XFILE::CPipeFile *)cls; pipe->OpenForWrite(XFILE::PipesManager::GetInstance().GetUniquePipeName()); pipe->SetOpenThreashold(300); Demux_BXA_FmtHeader header; strncpy(header.fourcc, "BXA ", 4); header.type = BXA_PACKET_TYPE_FMT_DEMUX; header.bitsPerSample = bits; header.channels = channels; header.sampleRate = samplerate; header.durationMs = 0; if (pipe->Write(&header, sizeof(header)) == 0) return 0; ThreadMessage tMsg = { TMSG_MEDIA_STOP }; CApplicationMessenger::Get().SendMessage(tMsg, true); CFileItem item; item.SetPath(pipe->GetName()); item.SetMimeType("audio/x-xbmc-pcm"); CApplicationMessenger::Get().PlayFile(item); return session;//session }
ao_device* CAirTunesServer::AudioOutputFunctions::ao_open_live(int driver_id, ao_sample_format *format, ao_option *option) { ao_device_xbmc* device = new ao_device_xbmc(); device->pipe = new XFILE::CPipeFile; device->pipe->OpenForWrite(XFILE::PipesManager::GetInstance().GetUniquePipeName()); device->pipe->SetOpenThreashold(300); BXA_FmtHeader header; strncpy(header.fourcc, "BXA ", 4); header.type = BXA_PACKET_TYPE_FMT; header.bitsPerSample = format->bits; header.channels = format->channels; header.sampleRate = format->rate; header.durationMs = 0; if (device->pipe->Write(&header, sizeof(header)) == 0) { delete device->pipe; delete device; return 0; } ThreadMessage tMsg = { TMSG_MEDIA_STOP }; CApplicationMessenger::Get().SendMessage(tMsg, true); CFileItem item; item.SetPath(device->pipe->GetName()); item.SetMimeType("audio/x-xbmc-pcm"); if (ao_get_option(option, "artist")) item.GetMusicInfoTag()->SetArtist(ao_get_option(option, "artist")); if (ao_get_option(option, "album")) item.GetMusicInfoTag()->SetAlbum(ao_get_option(option, "album")); if (ao_get_option(option, "name")) item.GetMusicInfoTag()->SetTitle(ao_get_option(option, "name")); ThreadMessage tMsg2 = { TMSG_GUI_ACTIVATE_WINDOW, WINDOW_VISUALISATION, 0 }; CApplicationMessenger::Get().SendMessage(tMsg2, true); CApplicationMessenger::Get().PlayFile(item); return (ao_device*) device; }
bool CPluginDirectory::GetPluginResult(const CStdString& strPath, CFileItem &resultItem) { CURL url(strPath); CPluginDirectory* newDir = new CPluginDirectory(); bool success = newDir->StartScript(strPath, false); if (success) { // update the play path, saving the old one as needed if (!resultItem.HasProperty("original_listitem_url")) resultItem.SetProperty("original_listitem_url", resultItem.m_strPath); resultItem.m_strPath = newDir->m_fileResult->m_strPath; resultItem.SetMimeType(newDir->m_fileResult->GetMimeType(false)); } delete newDir; return success; }
bool CPluginDirectory::GetPluginResult(const std::string& strPath, CFileItem &resultItem) { CURL url(strPath); CPluginDirectory newDir; bool success = newDir.StartScript(strPath, false); if (success) { // update the play path and metadata, saving the old one as needed if (!resultItem.HasProperty("original_listitem_url")) resultItem.SetProperty("original_listitem_url", resultItem.GetPath()); resultItem.SetPath(newDir.m_fileResult->GetPath()); resultItem.SetMimeType(newDir.m_fileResult->GetMimeType()); resultItem.UpdateInfo(*newDir.m_fileResult); if (newDir.m_fileResult->HasVideoInfoTag() && newDir.m_fileResult->GetVideoInfoTag()->m_resumePoint.IsSet()) resultItem.m_lStartOffset = STARTOFFSET_RESUME; // resume point set in the resume item, so force resume } return success; }
void* CAirTunesServer::AudioOutputFunctions::audio_init(void *cls, int bits, int channels, int samplerate) { XFILE::CPipeFile *pipe=(XFILE::CPipeFile *)cls; const CURL pathToUrl(XFILE::PipesManager::GetInstance().GetUniquePipeName()); pipe->OpenForWrite(pathToUrl); pipe->SetOpenThreashold(300); Demux_BXA_FmtHeader header; strncpy(header.fourcc, "BXA ", 4); header.type = BXA_PACKET_TYPE_FMT_DEMUX; header.bitsPerSample = bits; header.channels = channels; header.sampleRate = samplerate; header.durationMs = 0; if (pipe->Write(&header, sizeof(header)) == 0) return 0; CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP); CFileItem *item = new CFileItem(); item->SetPath(pipe->GetName()); item->SetMimeType("audio/x-xbmc-pcm"); m_streamStarted = true; m_sampleRate = samplerate; CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, 0, 0, static_cast<void*>(item)); // Not all airplay streams will provide metadata (e.g. if using mirroring, // no metadata will be sent). If there *is* metadata, it will be received // in a later call to audio_set_metadata/audio_set_coverart. ResetMetadata(); // browse for dacp services protocol which gives us the remote control service CZeroconfBrowser::GetInstance()->Start(); CZeroconfBrowser::GetInstance()->AddServiceType(ZEROCONF_DACP_SERVICE); CAirTunesServer::EnableActionProcessing(true); return session;//session }
/*---------------------------------------------------------------------- | CUPnPDirectory::GetDirectory +---------------------------------------------------------------------*/ bool CUPnPDirectory::GetResource(const CURL& path, CFileItem &item) { if(path.GetProtocol() != "upnp") return false; CUPnP* upnp = CUPnP::GetInstance(); if(!upnp) return false; CStdString uuid = path.GetHostName(); CStdString object = path.GetFileName(); object.TrimRight("/"); CURL::Decode(object); PLT_DeviceDataReference device; if(!FindDeviceWait(upnp, uuid.c_str(), device)) return false; PLT_MediaObjectListReference list; if (NPT_FAILED(upnp->m_MediaBrowser->BrowseSync(device, object.c_str(), list, true))) return false; PLT_MediaObjectList::Iterator entry = list->GetFirstItem(); if (entry == 0) return false; PLT_MediaItemResource resource; // look for a resource with "xbmc-get" protocol // if we can't find one, keep the first resource if(NPT_FAILED(NPT_ContainerFind((*entry)->m_Resources, CProtocolFinder("xbmc-get"), resource))) { if((*entry)->m_Resources.GetItemCount()) resource = (*entry)->m_Resources[0]; else return false; } // store original path so we remember it item.SetProperty("original_listitem_url", item.GetPath()); item.SetProperty("original_listitem_mime", item.GetMimeType(false)); // if it's an item, path is the first url to the item // we hope the server made the first one reachable for us // (it could be a format we dont know how to play however) item.SetPath((const char*) resource.m_Uri); // look for content type in protocol info if (resource.m_ProtocolInfo.IsValid()) { CLog::Log(LOGDEBUG, "CUPnPDirectory::GetResource - resource protocol info '%s'", (const char*)(resource.m_ProtocolInfo.ToString())); if (resource.m_ProtocolInfo.GetContentType().Compare("application/octet-stream") != 0) { item.SetMimeType((const char*)resource.m_ProtocolInfo.GetContentType()); } } else { CLog::Log(LOGERROR, "CUPnPDirectory::GetResource - invalid protocol info '%s'", (const char*)(resource.m_ProtocolInfo.ToString())); } // look for subtitles unsigned subs = 0; for(unsigned r = 0; r < (*entry)->m_Resources.GetItemCount(); r++) { PLT_MediaItemResource& res = (*entry)->m_Resources[r]; PLT_ProtocolInfo& info = res.m_ProtocolInfo; static const char* allowed[] = { "text/srt" , "text/ssa" , "text/sub" , "text/idx" }; for(unsigned type = 0; type < sizeof(allowed)/sizeof(allowed[0]); type++) { if(info.Match(PLT_ProtocolInfo("*", "*", allowed[type], "*"))) { CStdString prop; prop.Format("upnp:subtitle:%d", ++subs); item.SetProperty(prop, (const char*)res.m_Uri); break; } } } return true; }