/*---------------------------------------------------------------------- | CUPnPRenderer::OnSetAVTransportURI +---------------------------------------------------------------------*/ NPT_Result CUPnPRenderer::OnSetAVTransportURI(PLT_ActionReference& action) { NPT_String uri, meta; PLT_Service* service; NPT_CHECK_SEVERE(FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", service)); NPT_CHECK_SEVERE(action->GetArgumentValue("CurrentURI", uri)); NPT_CHECK_SEVERE(action->GetArgumentValue("CurrentURIMetaData", meta)); // if not playing already, just keep around uri & metadata // and wait for play command if (!g_application.IsPlaying() && g_windowManager.GetActiveWindow() != WINDOW_SLIDESHOW) { service->SetStateVariable("TransportState", "STOPPED"); service->SetStateVariable("TransportStatus", "OK"); service->SetStateVariable("TransportPlaySpeed", "1"); service->SetStateVariable("AVTransportURI", uri); service->SetStateVariable("AVTransportURIMetaData", meta); NPT_CHECK_SEVERE(action->SetArgumentsOutFromStateVariable()); return NPT_SUCCESS; } return PlayMedia(uri, meta, action.AsPointer()); }
/*---------------------------------------------------------------------- | PLT_MediaRenderer::OnSetAVTransportURI +---------------------------------------------------------------------*/ NPT_Result PLT_MediaRenderer::OnSetAVTransportURI(PLT_ActionReference& action) { /*test*/ PLT_Service* serviceAVT; NPT_CHECK_WARNING(FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", serviceAVT)); // update service state variables //serviceAVT->SetStateVariable("TransportState", "TRANSITIONING"); /*test*/ if (m_Delegate) { return m_Delegate->OnSetAVTransportURI(action); } // default implementation is using state variable NPT_String uri; NPT_CHECK_WARNING(action->GetArgumentValue("CurrentURI", uri)); NPT_String metadata; NPT_CHECK_WARNING(action->GetArgumentValue("CurrentURIMetaData", metadata)); //PLT_Service* serviceAVT; //NPT_CHECK_WARNING(FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", serviceAVT)); // update service state variables serviceAVT->SetStateVariable("AVTransportURI", uri); serviceAVT->SetStateVariable("AVTransportURIMetaData", metadata); //serviceAVT->SetStateVariable("TransportState", "PLAYING");//test OutputDebugString(uri.GetChars()); return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_MediaRenderer::OnSetAVTransportURI +---------------------------------------------------------------------*/ NPT_Result PLT_MediaRenderer::OnSetAVTransportURI(PLT_ActionReference& action) { if (m_Delegate) { return m_Delegate->OnSetAVTransportURI(action); } // default implementation is using state variable NPT_String uri; NPT_CHECK_WARNING(action->GetArgumentValue("CurrentURI", uri)); NPT_String metadata; NPT_CHECK_WARNING(action->GetArgumentValue("CurrentURIMetaData", metadata)); PLT_Service* serviceAVT; NPT_CHECK_WARNING(FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", serviceAVT)); // update service state variables serviceAVT->SetStateVariable("AVTransportURI", uri); serviceAVT->SetStateVariable("AVTransportURIMetaData", metadata); serviceAVT->SetStateVariable("TransportState", "STOPPED"); serviceAVT->SetStateVariable("TransportStatus", "OK"); serviceAVT->SetStateVariable("TransportPlaySpeed", "1"); NPT_CHECK_SEVERE(action->SetArgumentsOutFromStateVariable()); return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | CUPnPRenderer::OnSetAVTransportURI +---------------------------------------------------------------------*/ NPT_Result CUPnPRenderer::OnSetNextAVTransportURI(PLT_ActionReference& action) { NPT_String uri, meta; PLT_Service* service; NPT_CHECK_SEVERE(FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", service)); NPT_CHECK_SEVERE(action->GetArgumentValue("NextURI", uri)); NPT_CHECK_SEVERE(action->GetArgumentValue("NextURIMetaData", meta)); CFileItemPtr item = GetFileItem(uri, meta); if (!item) { return NPT_FAILURE; } #if 0 if (g_application.m_pPlayer->IsPlaying()) { int playlist = PLAYLIST_MUSIC; if(item->IsVideo()) playlist = PLAYLIST_VIDEO; { CSingleLock lock(g_graphicsContext); g_playlistPlayer.ClearPlaylist(playlist); g_playlistPlayer.Add(playlist, item); g_playlistPlayer.SetCurrentSong(-1); g_playlistPlayer.SetCurrentPlaylist(playlist); } CGUIMessage msg(GUI_MSG_PLAYLIST_CHANGED, 0, 0); g_windowManager.SendThreadMessage(msg); service->SetStateVariable("NextAVTransportURI", uri); service->SetStateVariable("NextAVTransportURIMetaData", meta); NPT_CHECK_SEVERE(action->SetArgumentsOutFromStateVariable()); return NPT_SUCCESS; } else if (g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW) { return NPT_FAILURE; } else { return NPT_FAILURE; } #endif return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | CUPnPRenderer::PlayMedia +---------------------------------------------------------------------*/ NPT_Result CUPnPRenderer::PlayMedia(const NPT_String& uri, const NPT_String& meta, PLT_Action* action) { PLT_Service* service; NPT_CHECK_SEVERE(FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", service)); { NPT_AutoLock lock(m_state); service->SetStateVariable("TransportState", "TRANSITIONING"); service->SetStateVariable("TransportStatus", "OK"); } CFileItemPtr item = GetFileItem(uri, meta); if (!item) { return NPT_FAILURE; } #if 0 if (item->IsPicture()) { CApplicationMessenger::Get().PictureShow(item->GetPath()); } else { CApplicationMessenger::Get().MediaPlay(*item); } if (g_application.m_pPlayer->IsPlaying() || g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW) { NPT_AutoLock lock(m_state); service->SetStateVariable("TransportState", "PLAYING"); service->SetStateVariable("TransportStatus", "OK"); service->SetStateVariable("AVTransportURI", uri); service->SetStateVariable("AVTransportURIMetaData", meta); } else { NPT_AutoLock lock(m_state); service->SetStateVariable("TransportState", "STOPPED"); service->SetStateVariable("TransportStatus", "ERROR_OCCURRED"); } service->SetStateVariable("NextAVTransportURI", ""); service->SetStateVariable("NextAVTransportURIMetaData", ""); if (action) { NPT_CHECK_SEVERE(action->SetArgumentsOutFromStateVariable()); } #endif return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_Simple::SetupServices +---------------------------------------------------------------------*/ NPT_Result PLT_Simple::SetupServices() { PLT_Service* service = new PLT_Service( this, "urn:schemas-upnp-org:service:Test:1", "urn:upnp-org:serviceId:Test.001", "Test"); NPT_CHECK_FATAL(service->SetSCPDXML((const char*)SCPDXML_SIMPLE)); NPT_CHECK_FATAL(AddService(service)); service->SetStateVariable("Status", "True"); return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_LightSampleDevice::SetupServices +---------------------------------------------------------------------*/ NPT_Result PLT_LightSampleDevice::SetupServices(PLT_DeviceData& data) { PLT_Service* service = new PLT_Service( this, "urn:schemas-upnp-org:service:SwitchPower:1", "urn:upnp-org:serviceId:SwitchPower.001"); NPT_CHECK_FATAL(service->SetSCPDXML((const char*)SCPDXML)); NPT_CHECK_FATAL(service->InitURLs("SwitchPower", m_UUID)); NPT_CHECK_FATAL(data.AddService(service)); service->SetStateVariable("Status", "True"); return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_LightSampleDevice::PLT_LightSampleDevice +---------------------------------------------------------------------*/ PLT_LightSampleDevice::PLT_LightSampleDevice(char* FriendlyName, char* UUID) : PLT_DeviceHost("/", UUID, "urn:schemas-upnp-org:device:SwitchPower:1", FriendlyName) { PLT_Service* service = new PLT_Service( this, "urn:schemas-upnp-org:service:SwitchPower:1", "urn:upnp-org:serviceId:SwitchPower.001"); if (SCPDXML && NPT_SUCCEEDED(service->SetSCPDXML((const char*)SCPDXML))) { service->InitURLs("SwitchPower", m_UUID); AddService(service); } else { delete service; } service->SetStateVariable("Status", "True"); }
/*---------------------------------------------------------------------- | CUPnPRenderer::PlayMedia +---------------------------------------------------------------------*/ NPT_Result CUPnPRenderer::PlayMedia(const NPT_String& uri, const NPT_String& meta, PLT_Action* action) { PLT_Service* service; NPT_CHECK_SEVERE(FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", service)); { NPT_AutoLock lock(m_state); service->SetStateVariable("TransportState", "TRANSITIONING"); service->SetStateVariable("TransportStatus", "OK"); } CFileItemPtr item = GetFileItem(uri, meta); if (!item) { return NPT_FAILURE; } if (item->IsPicture()) { CApplicationMessenger::GetInstance().PostMsg(TMSG_PICTURE_SHOW, -1, -1, nullptr, item->GetPath()); } else { CFileItemList *l = new CFileItemList; //don't delete, l->Add(std::make_shared<CFileItem>(*item)); CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, -1, -1, static_cast<void*>(l)); } // just return success because the play actions are asynchronous NPT_AutoLock lock(m_state); service->SetStateVariable("TransportState", "PLAYING"); service->SetStateVariable("TransportStatus", "OK"); service->SetStateVariable("AVTransportURI", uri); service->SetStateVariable("AVTransportURIMetaData", meta); service->SetStateVariable("NextAVTransportURI", ""); service->SetStateVariable("NextAVTransportURIMetaData", ""); if (action) { NPT_CHECK_SEVERE(action->SetArgumentsOutFromStateVariable()); } return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_LightSampleDevice::SetupServices +---------------------------------------------------------------------*/ NPT_Result PLT_LightSampleDevice::SetupServices() { NPT_Result res; PLT_Service* service = new PLT_Service( this, "urn:schemas-upnp-org:service:SwitchPower:1", "urn:upnp-org:serviceId:SwitchPower.001", "SwitchPower"); NPT_CHECK_LABEL_FATAL(res = service->SetSCPDXML((const char*)SCPDXML), failure); NPT_CHECK_LABEL_FATAL(res = AddService(service), failure); service->SetStateVariable("Status", "True"); return NPT_SUCCESS; failure: delete service; return res; }
/*---------------------------------------------------------------------- | PLT_Simple::SetupServices +---------------------------------------------------------------------*/ NPT_Result PLT_Simple::SetupServices() { NPT_Result res; PLT_Service* service = new PLT_Service( this, "urn:schemas-upnp-org:service:Test:1", "urn:upnp-org:serviceId:Test.001", "Test"); NPT_CHECK_LABEL_FATAL(res = service->SetSCPDXML((const char*)SCPDXML_SIMPLE), failure); NPT_CHECK_LABEL_FATAL(res = AddService(service), failure); service->SetStateVariable("Status", "True"); return NPT_SUCCESS; failure: delete service; return res; }
/*---------------------------------------------------------------------- | PLT_MediaServer::SetupServices +---------------------------------------------------------------------*/ NPT_Result PLT_MediaServer::SetupServices() { PLT_Service* service; { service = new PLT_Service( this, "urn:schemas-upnp-org:service:ContentDirectory:1", "urn:upnp-org:serviceId:ContentDirectory", "ContentDirectory"); NPT_CHECK_FATAL(service->SetSCPDXML((const char*) MS_ContentDirectorywSearchSCPD)); NPT_CHECK_FATAL(AddService(service)); service->SetStateVariable("ContainerUpdateIDs", ""); service->SetStateVariableRate("ContainerUpdateIDs", NPT_TimeInterval(2.)); service->SetStateVariable("SystemUpdateID", "0"); service->SetStateVariableRate("SystemUpdateID", NPT_TimeInterval(2.)); service->SetStateVariable("SearchCapability", "@id,@refID,dc:title,upnp:class,upnp:genre,upnp:artist,upnp:author,upnp:author@role,upnp:album,dc:creator,res@size,res@duration,res@protocolInfo,res@protection,dc:publisher,dc:language,upnp:originalTrackNumber,dc:date,upnp:producer,upnp:rating,upnp:actor,upnp:director,upnp:toc,dc:description,microsoft:userRatingInStars,microsoft:userEffectiveRatingInStars,microsoft:userRating,microsoft:userEffectiveRating,microsoft:serviceProvider,microsoft:artistAlbumArtist,microsoft:artistPerformer,microsoft:artistConductor,microsoft:authorComposer,microsoft:authorOriginalLyricist,microsoft:authorWriter,upnp:userAnnotation,upnp:channelName,upnp:longDescription,upnp:programTitle"); service->SetStateVariable("SortCapability", "dc:title,upnp:genre,upnp:album,dc:creator,res@size,res@duration,res@bitrate,dc:publisher,dc:language,upnp:originalTrackNumber,dc:date,upnp:producer,upnp:rating,upnp:actor,upnp:director,upnp:toc,dc:description,microsoft:year,microsoft:userRatingInStars,microsoft:userEffectiveRatingInStars,microsoft:userRating,microsoft:userEffectiveRating,microsoft:serviceProvider,microsoft:artistAlbumArtist,microsoft:artistPerformer,microsoft:artistConductor,microsoft:authorComposer,microsoft:authorOriginalLyricist,microsoft:authorWriter,microsoft:sourceUrl,upnp:userAnnotation,upnp:channelName,upnp:longDescription,upnp:programTitle"); } { service = new PLT_Service( this, "urn:schemas-upnp-org:service:ConnectionManager:1", "urn:upnp-org:serviceId:ConnectionManager", "ConnectionManager"); NPT_CHECK_FATAL(service->SetSCPDXML((const char*) MS_ConnectionManagerSCPD)); NPT_CHECK_FATAL(AddService(service)); service->SetStateVariable("CurrentConnectionIDs", "0"); service->SetStateVariable("SinkProtocolInfo", ""); service->SetStateVariable("SourceProtocolInfo", "http-get:*:*:*"); } return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_MediaServer::SetupServices +---------------------------------------------------------------------*/ NPT_Result PLT_MediaServer::SetupServices() { PLT_Service* service; { service = new PLT_Service( this, "urn:schemas-upnp-org:service:ContentDirectory:1", "urn:upnp-org:serviceId:ContentDirectory", "ContentDirectory"); NPT_CHECK_FATAL(service->SetSCPDXML((const char*) MS_ContentDirectorywSearchSCPD)); NPT_CHECK_FATAL(AddService(service)); service->SetStateVariable("ContainerUpdateIDs", ""); service->SetStateVariableRate("ContainerUpdateIDs", NPT_TimeInterval(2.)); service->SetStateVariable("SystemUpdateID", "0"); service->SetStateVariableRate("SystemUpdateID", NPT_TimeInterval(2.)); service->SetStateVariable("SearchCapability", "upnp:class"); service->SetStateVariable("SortCapability", ""); } { service = new PLT_Service( this, "urn:schemas-upnp-org:service:ConnectionManager:1", "urn:upnp-org:serviceId:ConnectionManager", "ConnectionManager"); NPT_CHECK_FATAL(service->SetSCPDXML((const char*) MS_ConnectionManagerSCPD)); NPT_CHECK_FATAL(AddService(service)); service->SetStateVariable("CurrentConnectionIDs", "0"); service->SetStateVariable("SinkProtocolInfo", ""); service->SetStateVariable("SourceProtocolInfo", "http-get:*:*:*"); } return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | CUPnPRenderer::PlayMedia +---------------------------------------------------------------------*/ NPT_Result CUPnPRenderer::PlayMedia(const char* uri, const char* meta, PLT_Action* action) { bool bImageFile = false; PLT_Service* service; NPT_CHECK_SEVERE(FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", service)); { NPT_AutoLock lock(m_state); service->SetStateVariable("TransportState", "TRANSITIONING"); service->SetStateVariable("TransportStatus", "OK"); } PLT_MediaObjectListReference list; PLT_MediaObject* object = NULL; if (meta && NPT_SUCCEEDED(PLT_Didl::FromDidl(meta, list))) { list->Get(0, object); } if (object) { CFileItem item(uri, false); PLT_MediaItemResource* res = object->m_Resources.GetFirstItem(); for(NPT_Cardinal i = 0; i < object->m_Resources.GetItemCount(); i++) { if(object->m_Resources[i].m_Uri == uri) { res = &object->m_Resources[i]; break; } } for(NPT_Cardinal i = 0; i < object->m_Resources.GetItemCount(); i++) { if(object->m_Resources[i].m_ProtocolInfo.ToString().StartsWith("xbmc-get:")) { res = &object->m_Resources[i]; item.SetPath(CStdString(res->m_Uri)); break; } } if (res && res->m_ProtocolInfo.IsValid()) { item.SetMimeType((const char*)res->m_ProtocolInfo.GetContentType()); } item.m_dateTime.SetFromDateString((const char*)object->m_Date); item.m_strTitle = (const char*)object->m_Title; item.SetLabel((const char*)object->m_Title); item.SetLabelPreformated(true); if (object->m_ExtraInfo.album_arts.GetItem(0)) { //FIXME only considers 1st image item.SetArt("thumb", (const char*)object->m_ExtraInfo.album_arts.GetItem(0)->uri); } if (object->m_ObjectClass.type.StartsWith("object.item.audioItem")) { if(NPT_SUCCEEDED(PopulateTagFromObject(*item.GetMusicInfoTag(), *object, res))) item.SetLabelPreformated(false); } else if (object->m_ObjectClass.type.StartsWith("object.item.videoItem")) { if(NPT_SUCCEEDED(PopulateTagFromObject(*item.GetVideoInfoTag(), *object, res))) item.SetLabelPreformated(false); } else if (object->m_ObjectClass.type.StartsWith("object.item.imageItem")) { bImageFile = true; } bImageFile?CApplicationMessenger::Get().PictureShow(item.GetPath()) :CApplicationMessenger::Get().MediaPlay(item); } else { bImageFile = NPT_String(PLT_MediaObject::GetUPnPClass(uri)).StartsWith("object.item.imageItem", true); bImageFile?CApplicationMessenger::Get().PictureShow((const char*)uri) :CApplicationMessenger::Get().MediaPlay((const char*)uri); } if (g_application.IsPlaying() || g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW) { NPT_AutoLock lock(m_state); service->SetStateVariable("TransportState", "PLAYING"); service->SetStateVariable("TransportStatus", "OK"); service->SetStateVariable("AVTransportURI", uri); service->SetStateVariable("AVTransportURIMetaData", meta); } else { NPT_AutoLock lock(m_state); service->SetStateVariable("TransportState", "STOPPED"); service->SetStateVariable("TransportStatus", "ERROR_OCCURRED"); } if (action) { NPT_CHECK_SEVERE(action->SetArgumentsOutFromStateVariable()); } return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_MediaRenderer::PLT_MediaRenderer +---------------------------------------------------------------------*/ PLT_MediaRenderer::PLT_MediaRenderer(PlaybackCmdListener* listener, const char* friendly_name, bool show_ip, const char* uuid, unsigned int port) : PLT_DeviceHost("/", uuid, "urn:schemas-upnp-org:device:MediaRenderer:1", friendly_name, show_ip, port) { NPT_COMPILER_UNUSED(listener); PLT_Service* service; /* AVTransport */ service = new PLT_Service( this, "urn:schemas-upnp-org:service:AVTransport:1", "urn:upnp-org:serviceId:AVT_1-0"); if (NPT_SUCCEEDED(service->SetSCPDXML((const char*) RDR_AVTransportSCPD))) { service->InitURLs("AVTransport", m_UUID); AddService(service); service->SetStateVariableRate("LastChange", NPT_TimeInterval(0.2f)); // GetCurrentTransportActions service->SetStateVariable("CurrentTransportActions", "", false); // GetDeviceCapabilities service->SetStateVariable("PossiblePlaybackStorageMedia", "vendor-defined ,NOT_IMPLEMENTED,NONE,NETWORK,MICRO-MV,HDD,LD,DAT,DVD-AUDIO,DVD-RAM,DVD-RW,DVD+RW,DVD-R,DVD-VIDEO,DVD-ROM,MD-PICTURE,MD-AUDIO,SACD,VIDEO-CD,CD-RW,CD-R,CD-DA,CD-ROM,HI8,VIDEO8,VHSC,D-VHS,S-VHS,W-VHS,VHS,MINI-DV,DV,UNKNOWN", false); service->SetStateVariable("PossibleRecordStorageMedia", "vendor-defined ,NOT_IMPLEMENTED,NONE,NETWORK,MICRO-MV,HDD,LD,DAT,DVD-AUDIO,DVD-RAM,DVD-RW,DVD+RW,DVD-R,DVD-VIDEO,DVD-ROM,MD-PICTURE,MD-AUDIO,SACD,VIDEO-CD,CD-RW,CD-R,CD-DA,CD-ROM,HI8,VIDEO8,VHSC,D-VHS,S-VHS,W-VHS,VHS,MINI-DV,DV,UNKNOWN", false); service->SetStateVariable("PossibleRecordQualityModes", "vendor-defined ,NOT_IMPLEMENTED,2:HIGH,1:MEDIUM,0:BASIC,2:SP,1:LP,0:EP", false); // GetMediaInfo service->SetStateVariable("PlaybackStorageMedium", "UNKNOWN", false); service->SetStateVariable("RecordStorageMedium", "UNKNOWN", false); service->SetStateVariable("RecordMediumWriteStatus", "UNKNOWN", false); service->SetStateVariable("NumberOfTracks", "0", false); service->SetStateVariable("CurrentTrackDuration", "00:00:00", false); service->SetStateVariable("CurrentMediaDuration", "00:00:00", false); service->SetStateVariable("NextAVTransportURI", "NOT_IMPLEMENTED", false); service->SetStateVariable("NextAVTransportURIMetadata", "NOT_IMPLEMENTED", false); // GetPositionInfo service->SetStateVariable("AbsTime", "NOT_IMPLEMENTED", false); service->SetStateVariable("CurrentTrack", "0", false); service->SetStateVariable("RelativeTimePosition", "00:00:00", false); //?? service->SetStateVariable("AbsoluteTimePosition", "NOT_IMPLEMENTED", false); //?? service->SetStateVariable("RelativeCounterPosition", "0", false); //?? service->SetStateVariable("AbsoluteCounterPosition", "0", false); //?? // GetTransportInfo service->SetStateVariable("TransportState", "NO_MEDIA_PRESENT", false); service->SetStateVariable("TransportStatus", "OK", false); service->SetStateVariable("TransportPlaySpeed", "1", false); // GetTransportSettings service->SetStateVariable("CurrentPlayMode", "NORMAL", false); service->SetStateVariable("CurrentRecordQualityMode", "NOT_IMPLEMENTED", false); } /* ConnectionManager */ service = new PLT_Service( this, "urn:schemas-upnp-org:service:ConnectionManager:1", "urn:upnp-org:serviceId:CMGR_1-0"); if (NPT_SUCCEEDED(service->SetSCPDXML((const char*) RDR_ConnectionManagerSCPD))) { service->InitURLs("ConnectionManager", m_UUID); AddService(service); service->SetStateVariable("CurrentConnectionIDs", "0", false); // put all supported mime types here instead service->SetStateVariable("SinkProtocolInfo", "http-get:*:*:*", false); service->SetStateVariable("SourceProtocolInfo", "", false); } /* RenderingControl */ service = new PLT_Service( this, "urn:schemas-upnp-org:service:RenderingControl:1", "urn:upnp-org:serviceId:RCS_1-0"); if (NPT_SUCCEEDED(service->SetSCPDXML((const char*) RDR_RenderingControlSCPD))) { service->InitURLs("RenderingControl", m_UUID); AddService(service); service->SetStateVariableRate("LastChange", NPT_TimeInterval(0.2f)); } }
/*---------------------------------------------------------------------- | PLT_MediaRenderer::SetupServices +---------------------------------------------------------------------*/ NPT_Result PLT_MediaRenderer::SetupServices() { PLT_Service* service; { /* AVTransport */ service = new PLT_Service( this, "urn:schemas-upnp-org:service:AVTransport:1", "urn:upnp-org:serviceId:AVTransport", "AVTransport", "urn:schemas-upnp-org:metadata-1-0/AVT/"); NPT_CHECK_FATAL(service->SetSCPDXML((const char*) RDR_AVTransportSCPD)); NPT_CHECK_FATAL(AddService(service)); service->SetStateVariableRate("LastChange", NPT_TimeInterval(0.2f)); service->SetStateVariable("A_ARG_TYPE_InstanceID", "0"); // GetCurrentTransportActions service->SetStateVariable("CurrentTransportActions", "Play,Pause,Stop,Seek,Next,Previous"); // GetDeviceCapabilities service->SetStateVariable("PossiblePlaybackStorageMedia", "NONE,NETWORK,HDD,CD-DA,UNKNOWN"); service->SetStateVariable("PossibleRecordStorageMedia", "NOT_IMPLEMENTED"); service->SetStateVariable("PossibleRecordQualityModes", "NOT_IMPLEMENTED"); // GetMediaInfo service->SetStateVariable("NumberOfTracks", "0"); service->SetStateVariable("CurrentMediaDuration", "00:00:00"); service->SetStateVariable("AVTransportURI", ""); service->SetStateVariable("AVTransportURIMetadata", "");; service->SetStateVariable("NextAVTransportURI", "NOT_IMPLEMENTED"); service->SetStateVariable("NextAVTransportURIMetadata", "NOT_IMPLEMENTED"); service->SetStateVariable("PlaybackStorageMedium", "NONE"); service->SetStateVariable("RecordStorageMedium", "NOT_IMPLEMENTED"); service->SetStateVariable("RecordMediumWriteStatus", "NOT_IMPLEMENTED"); // GetPositionInfo service->SetStateVariable("CurrentTrack", "0"); service->SetStateVariable("CurrentTrackDuration", "00:00:00"); service->SetStateVariable("CurrentTrackMetadata", ""); service->SetStateVariable("CurrentTrackURI", ""); service->SetStateVariable("RelativeTimePosition", "00:00:00"); service->SetStateVariable("AbsoluteTimePosition", "00:00:00"); service->SetStateVariable("RelativeCounterPosition", "2147483647"); // means NOT_IMPLEMENTED service->SetStateVariable("AbsoluteCounterPosition", "2147483647"); // means NOT_IMPLEMENTED // disable indirect eventing for certain state variables PLT_StateVariable* var; var = service->FindStateVariable("RelativeTimePosition"); if (var) var->DisableIndirectEventing(); var = service->FindStateVariable("AbsoluteTimePosition"); if (var) var->DisableIndirectEventing(); var = service->FindStateVariable("RelativeCounterPosition"); if (var) var->DisableIndirectEventing(); var = service->FindStateVariable("AbsoluteCounterPosition"); if (var) var->DisableIndirectEventing(); // GetTransportInfo service->SetStateVariable("TransportState", "NO_MEDIA_PRESENT"); service->SetStateVariable("TransportStatus", "OK"); service->SetStateVariable("TransportPlaySpeed", "1"); // GetTransportSettings service->SetStateVariable("CurrentPlayMode", "NORMAL"); service->SetStateVariable("CurrentRecordQualityMode", "NOT_IMPLEMENTED"); } { /* ConnectionManager */ service = new PLT_Service( this, "urn:schemas-upnp-org:service:ConnectionManager:1", "urn:upnp-org:serviceId:ConnectionManager", "ConnectionManager"); NPT_CHECK_FATAL(service->SetSCPDXML((const char*) RDR_ConnectionManagerSCPD)); NPT_CHECK_FATAL(AddService(service)); service->SetStateVariable("CurrentConnectionIDs", "0"); // put all supported mime types here instead service->SetStateVariable("SinkProtocolInfo", "http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO,http-get:*:video/x-ms-asf:DLNA.ORG_PN=MPEG4_P2_ASF_SP_G726,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMDRM_WMABASE,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAFULL,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMABASE,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVSPLL_BASE,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC_XAC3,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMDRM_WMVSPLL_BASE,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVSPML_BASE,http-get:*:video/x-ms-asf:DLNA.ORG_PN=MPEG4_P2_ASF_ASP_L5_SO_G726,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL_XAC3,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAPRO,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN,http-get:*:video/x-ms-asf:DLNA.ORG_PN=MPEG4_P2_ASF_ASP_L4_SO_G726,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3X,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVSPML_MP3,http-get:*:video/x-ms-wmv:*"); service->SetStateVariable("SourceProtocolInfo", ""); } { /* RenderingControl */ service = new PLT_Service( this, "urn:schemas-upnp-org:service:RenderingControl:1", "urn:upnp-org:serviceId:RenderingControl", "RenderingControl", "urn:schemas-upnp-org:metadata-1-0/RCS/"); NPT_CHECK_FATAL(service->SetSCPDXML((const char*) RDR_RenderingControlSCPD)); NPT_CHECK_FATAL(AddService(service)); service->SetStateVariableRate("LastChange", NPT_TimeInterval(0.2f)); service->SetStateVariable("Mute", "0"); service->SetStateVariableExtraAttribute("Mute", "Channel", "Master"); service->SetStateVariable("Volume", "100"); service->SetStateVariableExtraAttribute("Volume", "Channel", "Master"); service->SetStateVariable("VolumeDB", "0"); service->SetStateVariableExtraAttribute("VolumeDB", "Channel", "Master"); service->SetStateVariable("PresetNameList", "FactoryDefaults"); } return NPT_SUCCESS; }
NPT_Result GPAC_MediaRenderer::SetupServices(PLT_DeviceData& data) { PLT_Service* service; { /* AVTransport */ m_pAVService = new PLT_Service( &data, "urn:schemas-upnp-org:service:AVTransport:1", "urn:upnp-org:serviceId:AVT_1-0", "urn:schemas-upnp-org:metadata-1-0/AVT/"); NPT_CHECK_FATAL(m_pAVService->SetSCPDXML((const char*) RDR_AVTransportSCPD)); NPT_CHECK_FATAL(m_pAVService->InitURLs("AVTransport", data.GetUUID())); NPT_CHECK_FATAL(data.AddService(m_pAVService)); m_pAVService->SetStateVariableRate("LastChange", NPT_TimeInterval(0.2f)); m_pAVService->SetStateVariable("A_ARG_TYPE_InstanceID", "0"); // GetCurrentTransportActions m_pAVService->SetStateVariable("CurrentTransportActions", "Play,Pause,Stop,Seek,Next,Previous"); // GetDeviceCapabilities m_pAVService->SetStateVariable("PossiblePlaybackStorageMedia", "NONE,NETWORK"); m_pAVService->SetStateVariable("PossibleRecordStorageMedia", "NOT_IMPLEMENTED"); m_pAVService->SetStateVariable("PossibleRecordQualityModes", "NOT_IMPLEMENTED"); // GetMediaInfo m_pAVService->SetStateVariable("NumberOfTracks", "0"); m_pAVService->SetStateVariable("CurrentMediaDuration", "00:00:00");; m_pAVService->SetStateVariable("AVTransportURI", ""); m_pAVService->SetStateVariable("AVTransportURIMetadata", "");; m_pAVService->SetStateVariable("NextAVTransportURI", "NOT_IMPLEMENTED"); m_pAVService->SetStateVariable("NextAVTransportURIMetadata", "NOT_IMPLEMENTED"); m_pAVService->SetStateVariable("PlaybackStorageMedium", "NONE"); m_pAVService->SetStateVariable("RecordStorageMedium", "NOT_IMPLEMENTED"); m_pAVService->SetStateVariable("RecordMediumWriteStatus", "NOT_IMPLEMENTED"); // GetPositionInfo m_pAVService->SetStateVariable("CurrentTrack", "0"); m_pAVService->SetStateVariable("CurrentTrackDuration", "00:00:00"); m_pAVService->SetStateVariable("CurrentTrackMetadata", ""); m_pAVService->SetStateVariable("CurrentTrackURI", ""); m_pAVService->SetStateVariable("RelativeTimePosition", "00:00:00"); m_pAVService->SetStateVariable("AbsoluteTimePosition", "00:00:00"); m_pAVService->SetStateVariable("RelativeCounterPosition", "2147483647"); // means NOT_IMPLEMENTED m_pAVService->SetStateVariable("AbsoluteCounterPosition", "2147483647"); // means NOT_IMPLEMENTED // disable indirect eventing for certain state variables //PLT_StateVariable* var; //var = m_pAVService->FindStateVariable("RelativeTimePosition"); //if (var) var->DisableIndirectEventing(); //var = m_pAVService->FindStateVariable("AbsoluteTimePosition"); //if (var) var->DisableIndirectEventing(); //var = m_pAVService->FindStateVariable("RelativeCounterPosition"); //if (var) var->DisableIndirectEventing(); //var = m_pAVService->FindStateVariable("AbsoluteCounterPosition"); //if (var) var->DisableIndirectEventing(); // GetTransportInfo m_pAVService->SetStateVariable("TransportState", "NO_MEDIA_PRESENT"); m_pAVService->SetStateVariable("TransportStatus", "OK"); m_pAVService->SetStateVariable("TransportPlaySpeed", "1"); // GetTransportSettings m_pAVService->SetStateVariable("CurrentPlayMode", "NORMAL"); m_pAVService->SetStateVariable("CurrentRecordQualityMode", "NOT_IMPLEMENTED"); } { /* ConnectionManager */ service = new PLT_Service( &data, "urn:schemas-upnp-org:service:ConnectionManager:1", "urn:upnp-org:serviceId:CMGR_1-0"); NPT_CHECK_FATAL(service->SetSCPDXML((const char*) RDR_ConnectionManagerSCPD)); NPT_CHECK_FATAL(service->InitURLs("ConnectionManager", data.GetUUID())); NPT_CHECK_FATAL(data.AddService(service)); service->SetStateVariable("CurrentConnectionIDs", "0"); // put all supported mime types here instead service->SetStateVariable("SinkProtocolInfo", "http-get:*:*:*, rtsp-rtp-udp:*:*:*"); service->SetStateVariable("SourceProtocolInfo", ""); } { /* RenderingControl */ service = new PLT_Service( &data, "urn:schemas-upnp-org:service:RenderingControl:1", "urn:upnp-org:serviceId:RCS_1-0", "urn:schemas-upnp-org:metadata-1-0/RCS/"); NPT_CHECK_FATAL(service->SetSCPDXML((const char*) RDR_RenderingControlSCPD)); NPT_CHECK_FATAL(service->InitURLs("RenderingControl", data.GetUUID())); NPT_CHECK_FATAL(data.AddService(service)); service->SetStateVariableRate("LastChange", NPT_TimeInterval(0.2f)); service->SetStateVariable("Mute", "0"); service->SetStateVariable("Volume", "100"); } { static NPT_UInt8 MIGRATION_SCPDXML[] = "<scpd xmlns=\"urn:schemas-upnp-org:service-1-0\">\ <serviceStateTable>\ <stateVariable>\ <name>MigrationStatus</name>\ <sendEventsAttribute>no</sendEventsAttribute>\ <dataType>string</dataType>\ <allowedValueList>\ <allowedValue>OK</allowedValue>\ <allowedValue>ERROR_OCCURRED</allowedValue>\ </allowedValueList>\ </stateVariable>\ <stateVariable>\ <name>MigrationMetaData</name>\ <sendEventsAttribute>no</sendEventsAttribute>\ <dataType>string</dataType>\ </stateVariable>\ <stateVariable>\ <name>A_ARG_TYPE_InstanceID</name>\ <sendEventsAttribute>no</sendEventsAttribute>\ <dataType>ui4</dataType>\ </stateVariable>\ </serviceStateTable>\ <actionList>\ <action>\ <name>StopForMigration</name>\ <argumentList>\ <argument>\ <name>InstanceID</name>\ <direction>in</direction>\ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>\ </argument>\ <argument>\ <name>MigrationStatus</name>\ <direction>out</direction>\ <relatedStateVariable>MigrationStatus</relatedStateVariable>\ </argument>\ <argument>\ <name>MigrationMetaData</name>\ <direction>out</direction>\ <relatedStateVariable>MigrationMetaData</relatedStateVariable>\ </argument>\ </argumentList>\ </action>\ </actionList>\ </scpd>"; /* MigrationService */ m_pMigrationService = new PLT_Service(&data, "urn:intermedia:service:migration:1", "urn:intermedia:service:migration.001"); NPT_CHECK_FATAL(m_pMigrationService->SetSCPDXML((const char*) MIGRATION_SCPDXML)); NPT_CHECK_FATAL(m_pMigrationService->InitURLs("SessionMigration", data.GetUUID())); NPT_CHECK_FATAL(data.AddService(m_pMigrationService)); m_pMigrationService->SetStateVariable("MigrationStatus", "OK"); m_pMigrationService->SetStateVariable("MigrationMetaData", ""); } return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_MediaRenderer::SetupServices +---------------------------------------------------------------------*/ NPT_Result PLT_MediaRenderer::SetupServices() { PLT_Service* service; { /* AVTransport */ service = new PLT_Service( this, "urn:schemas-upnp-org:service:AVTransport:1", "urn:upnp-org:serviceId:AVTransport", "AVTransport", "urn:schemas-upnp-org:metadata-1-0/AVT/"); NPT_CHECK_FATAL(service->SetSCPDXML((const char*) RDR_AVTransportSCPD)); NPT_CHECK_FATAL(AddService(service)); service->SetStateVariableRate("LastChange", NPT_TimeInterval(0.2f)); service->SetStateVariable("A_ARG_TYPE_InstanceID", "0"); // GetCurrentTransportActions service->SetStateVariable("CurrentTransportActions", "Play,Pause,Stop,Seek,Next,Previous"); // GetDeviceCapabilities service->SetStateVariable("PossiblePlaybackStorageMedia", "NONE,NETWORK,HDD,CD-DA,UNKNOWN"); service->SetStateVariable("PossibleRecordStorageMedia", "NOT_IMPLEMENTED"); service->SetStateVariable("PossibleRecordQualityModes", "NOT_IMPLEMENTED"); // GetMediaInfo service->SetStateVariable("NumberOfTracks", "0"); service->SetStateVariable("CurrentMediaDuration", "00:00:00"); service->SetStateVariable("AVTransportURI", ""); service->SetStateVariable("AVTransportURIMetadata", "");; service->SetStateVariable("NextAVTransportURI", "NOT_IMPLEMENTED"); service->SetStateVariable("NextAVTransportURIMetadata", "NOT_IMPLEMENTED"); service->SetStateVariable("PlaybackStorageMedium", "NONE"); service->SetStateVariable("RecordStorageMedium", "NOT_IMPLEMENTED"); service->SetStateVariable("RecordMediumWriteStatus", "NOT_IMPLEMENTED"); // GetPositionInfo service->SetStateVariable("CurrentTrack", "0"); service->SetStateVariable("CurrentTrackDuration", "00:00:00"); service->SetStateVariable("CurrentTrackMetadata", ""); service->SetStateVariable("CurrentTrackURI", ""); service->SetStateVariable("RelativeTimePosition", "00:00:00"); service->SetStateVariable("AbsoluteTimePosition", "00:00:00"); service->SetStateVariable("RelativeCounterPosition", "2147483647"); // means NOT_IMPLEMENTED service->SetStateVariable("AbsoluteCounterPosition", "2147483647"); // means NOT_IMPLEMENTED // disable indirect eventing for certain state variables PLT_StateVariable* var; var = service->FindStateVariable("RelativeTimePosition"); if (var) var->DisableIndirectEventing(); var = service->FindStateVariable("AbsoluteTimePosition"); if (var) var->DisableIndirectEventing(); var = service->FindStateVariable("RelativeCounterPosition"); if (var) var->DisableIndirectEventing(); var = service->FindStateVariable("AbsoluteCounterPosition"); if (var) var->DisableIndirectEventing(); // GetTransportInfo service->SetStateVariable("TransportState", "NO_MEDIA_PRESENT"); service->SetStateVariable("TransportStatus", "OK"); service->SetStateVariable("TransportPlaySpeed", "1"); // GetTransportSettings service->SetStateVariable("CurrentPlayMode", "NORMAL"); service->SetStateVariable("CurrentRecordQualityMode", "NOT_IMPLEMENTED"); } { /* ConnectionManager */ service = new PLT_Service( this, "urn:schemas-upnp-org:service:ConnectionManager:1", "urn:upnp-org:serviceId:ConnectionManager", "ConnectionManager"); NPT_CHECK_FATAL(service->SetSCPDXML((const char*) RDR_ConnectionManagerSCPD)); NPT_CHECK_FATAL(AddService(service)); service->SetStateVariable("CurrentConnectionIDs", "0"); // put all supported mime types here instead //service->SetStateVariable("SinkProtocolInfo", "http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO,http-get:*:video/x-ms-asf:DLNA.ORG_PN=MPEG4_P2_ASF_SP_G726,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMDRM_WMABASE,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAFULL,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMABASE,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVSPLL_BASE,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC_XAC3,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMDRM_WMVSPLL_BASE,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVSPML_BASE,http-get:*:video/x-ms-asf:DLNA.ORG_PN=MPEG4_P2_ASF_ASP_L5_SO_G726,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL_XAC3,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAPRO,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN,http-get:*:video/x-ms-asf:DLNA.ORG_PN=MPEG4_P2_ASF_ASP_L4_SO_G726,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3X,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVSPML_MP3,http-get:*:video/x-ms-wmv:*"); service->SetStateVariable("SinkProtocolInfo" ,"http-get:*:*:*" ",xbmc-get:*:*:*" ",http-get:*:audio/mpegurl:*" ",http-get:*:audio/mpeg:*" ",http-get:*:audio/mpeg3:*" ",http-get:*:audio/mp3:*" ",http-get:*:audio/mp4:*" ",http-get:*:audio/basic:*" ",http-get:*:audio/midi:*" ",http-get:*:audio/ulaw:*" ",http-get:*:audio/ogg:*" ",http-get:*:audio/DVI4:*" ",http-get:*:audio/G722:*" ",http-get:*:audio/G723:*" ",http-get:*:audio/G726-16:*" ",http-get:*:audio/G726-24:*" ",http-get:*:audio/G726-32:*" ",http-get:*:audio/G726-40:*" ",http-get:*:audio/G728:*" ",http-get:*:audio/G729:*" ",http-get:*:audio/G729D:*" ",http-get:*:audio/G729E:*" ",http-get:*:audio/GSM:*" ",http-get:*:audio/GSM-EFR:*" ",http-get:*:audio/L8:*" ",http-get:*:audio/L16:*" ",http-get:*:audio/LPC:*" ",http-get:*:audio/MPA:*" ",http-get:*:audio/PCMA:*" ",http-get:*:audio/PCMU:*" ",http-get:*:audio/QCELP:*" ",http-get:*:audio/RED:*" ",http-get:*:audio/VDVI:*" ",http-get:*:audio/ac3:*" ",http-get:*:audio/vorbis:*" ",http-get:*:audio/speex:*" ",http-get:*:audio/x-aiff:*" ",http-get:*:audio/x-pn-realaudio:*" ",http-get:*:audio/x-realaudio:*" ",http-get:*:audio/x-wav:*" ",http-get:*:audio/x-ms-wma:*" ",http-get:*:audio/x-mpegurl:*" ",http-get:*:application/x-shockwave-flash:*" ",http-get:*:application/ogg:*" ",http-get:*:application/sdp:*" ",http-get:*:image/gif:*" ",http-get:*:image/jpeg:*" ",http-get:*:image/ief:*" ",http-get:*:image/png:*" ",http-get:*:image/tiff:*" ",http-get:*:video/avi:*" ",http-get:*:video/mpeg:*" ",http-get:*:video/fli:*" ",http-get:*:video/flv:*" ",http-get:*:video/quicktime:*" ",http-get:*:video/vnd.vivo:*" ",http-get:*:video/vc1:*" ",http-get:*:video/ogg:*" ",http-get:*:video/mp4:*" ",http-get:*:video/BT656:*" ",http-get:*:video/CelB:*" ",http-get:*:video/JPEG:*" ",http-get:*:video/H261:*" ",http-get:*:video/H263:*" ",http-get:*:video/H263-1998:*" ",http-get:*:video/H263-2000:*" ",http-get:*:video/MPV:*" ",http-get:*:video/MP2T:*" ",http-get:*:video/MP1S:*" ",http-get:*:video/MP2P:*" ",http-get:*:video/BMPEG:*" ",http-get:*:video/x-ms-wmv:*" ",http-get:*:video/x-ms-avi:*" ",http-get:*:video/x-flv:*" ",http-get:*:video/x-fli:*" ",http-get:*:video/x-ms-asf:*" ",http-get:*:video/x-ms-asx:*" ",http-get:*:video/x-ms-wmx:*" ",http-get:*:video/x-ms-wvx:*" ",http-get:*:video/x-msvideo:*" ); service->SetStateVariable("SourceProtocolInfo", ""); } { /* RenderingControl */ service = new PLT_Service( this, "urn:schemas-upnp-org:service:RenderingControl:1", "urn:upnp-org:serviceId:RenderingControl", "RenderingControl", "urn:schemas-upnp-org:metadata-1-0/RCS/"); NPT_CHECK_FATAL(service->SetSCPDXML((const char*) RDR_RenderingControlSCPD)); NPT_CHECK_FATAL(AddService(service)); service->SetStateVariableRate("LastChange", NPT_TimeInterval(0.2f)); service->SetStateVariable("Mute", "0"); service->SetStateVariableExtraAttribute("Mute", "Channel", "Master"); service->SetStateVariable("Volume", "100"); service->SetStateVariableExtraAttribute("Volume", "Channel", "Master"); service->SetStateVariable("VolumeDB", "0"); service->SetStateVariableExtraAttribute("VolumeDB", "Channel", "Master"); service->SetStateVariable("PresetNameList", "FactoryDefaults"); } return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | CUPnPRenderer::SetupServices +---------------------------------------------------------------------*/ NPT_Result CUPnPRenderer::SetupServices() { NPT_CHECK(PLT_MediaRenderer::SetupServices()); // update what we can play PLT_Service* service = NULL; NPT_CHECK_FATAL(FindServiceByType("urn:schemas-upnp-org:service:ConnectionManager:1", service)); service->SetStateVariable("SinkProtocolInfo" ,"http-get:*:*:*" ",xbmc-get:*:*:*" ",http-get:*:audio/mkv:*" ",http-get:*:audio/mpegurl:*" ",http-get:*:audio/mpeg:*" ",http-get:*:audio/mpeg3:*" ",http-get:*:audio/mp3:*" ",http-get:*:audio/mp4:*" ",http-get:*:audio/basic:*" ",http-get:*:audio/midi:*" ",http-get:*:audio/ulaw:*" ",http-get:*:audio/ogg:*" ",http-get:*:audio/DVI4:*" ",http-get:*:audio/G722:*" ",http-get:*:audio/G723:*" ",http-get:*:audio/G726-16:*" ",http-get:*:audio/G726-24:*" ",http-get:*:audio/G726-32:*" ",http-get:*:audio/G726-40:*" ",http-get:*:audio/G728:*" ",http-get:*:audio/G729:*" ",http-get:*:audio/G729D:*" ",http-get:*:audio/G729E:*" ",http-get:*:audio/GSM:*" ",http-get:*:audio/GSM-EFR:*" ",http-get:*:audio/L8:*" ",http-get:*:audio/L16:*" ",http-get:*:audio/LPC:*" ",http-get:*:audio/MPA:*" ",http-get:*:audio/PCMA:*" ",http-get:*:audio/PCMU:*" ",http-get:*:audio/QCELP:*" ",http-get:*:audio/RED:*" ",http-get:*:audio/VDVI:*" ",http-get:*:audio/ac3:*" ",http-get:*:audio/vorbis:*" ",http-get:*:audio/speex:*" ",http-get:*:audio/flac:*" ",http-get:*:audio/x-flac:*" ",http-get:*:audio/x-aiff:*" ",http-get:*:audio/x-pn-realaudio:*" ",http-get:*:audio/x-realaudio:*" ",http-get:*:audio/x-wav:*" ",http-get:*:audio/x-matroska:*" ",http-get:*:audio/x-ms-wma:*" ",http-get:*:audio/x-mpegurl:*" ",http-get:*:application/x-shockwave-flash:*" ",http-get:*:application/ogg:*" ",http-get:*:application/sdp:*" ",http-get:*:image/gif:*" ",http-get:*:image/jpeg:*" ",http-get:*:image/ief:*" ",http-get:*:image/png:*" ",http-get:*:image/tiff:*" ",http-get:*:video/avi:*" ",http-get:*:video/divx:*" ",http-get:*:video/mpeg:*" ",http-get:*:video/fli:*" ",http-get:*:video/flv:*" ",http-get:*:video/quicktime:*" ",http-get:*:video/vnd.vivo:*" ",http-get:*:video/vc1:*" ",http-get:*:video/ogg:*" ",http-get:*:video/mp4:*" ",http-get:*:video/mkv:*" ",http-get:*:video/BT656:*" ",http-get:*:video/CelB:*" ",http-get:*:video/JPEG:*" ",http-get:*:video/H261:*" ",http-get:*:video/H263:*" ",http-get:*:video/H263-1998:*" ",http-get:*:video/H263-2000:*" ",http-get:*:video/MPV:*" ",http-get:*:video/MP2T:*" ",http-get:*:video/MP1S:*" ",http-get:*:video/MP2P:*" ",http-get:*:video/BMPEG:*" ",http-get:*:video/xvid:*" ",http-get:*:video/x-divx:*" ",http-get:*:video/x-matroska:*" ",http-get:*:video/x-mkv:*" ",http-get:*:video/x-ms-wmv:*" ",http-get:*:video/x-ms-avi:*" ",http-get:*:video/x-flv:*" ",http-get:*:video/x-fli:*" ",http-get:*:video/x-ms-asf:*" ",http-get:*:video/x-ms-asx:*" ",http-get:*:video/x-ms-wmx:*" ",http-get:*:video/x-ms-wvx:*" ",http-get:*:video/x-msvideo:*" ",http-get:*:video/x-xvid:*" ); NPT_CHECK_FATAL(FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", service)); service->SetStateVariable("NextAVTransportURI", ""); service->SetStateVariable("NextAVTransportURIMetadata", ""); return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_MediaRenderer::OnPlay +---------------------------------------------------------------------*/ NPT_Result PLT_MediaRenderer::OnPlay(PLT_ActionReference& action) { if (m_Delegate) { return m_Delegate->OnPlay(action); } NPT_String uri, meta; PLT_Service* service; //NPT_Cardinal max_items = 4; //PLT_ThreadTask *task; // look for value set previously by SetAVTransportURI NPT_CHECK_SEVERE(FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", service)); NPT_CHECK_SEVERE(service->GetStateVariableValue("AVTransportURI", uri)); NPT_CHECK_SEVERE(service->GetStateVariableValue("AVTransportURIMetaData", meta)); { NPT_AutoLock lock(m_state); service->SetStateVariable("TransportState", "TRANSITIONING"); service->SetStateVariable("TransportStatus", "OK"); } // transcoder process takes over here. it shall put the output to the media server's // media folder which can then be served by the media server when the media renderer // requests it via a media controller that is instantiated here to connect(control) // the transport of av between the renderer and the transcoder. //PLT_TaskManager manager(max_items); //manager.StartTask(task,0,true) ; int child_pid; char cmd[200]; char vcodec[] = "copy"; char acodec[] = "copy"; char fext[] = "flv"; //asf char fname[] = "/home/ted/Music/transcoded.flv"; //ffmpeg -i bbb.m4v -vf "movie=aa-logo.png [wm];[in][wm] overlay=10:H-h-10 [out]" -f m4v output.m4v //char* arg_list[] = {"ffmpeg",//"-v",//"0","-i",uri,"-vcodec",vcodec,"-acodec",acodec,//"-b",//"600k",//"-s",//"hd720","-f",fext,"-y",fname,NULL}; char* arg_list[] = { "ffmpeg", //"-v", //"0", "-i", uri, "-vcodec", "libx264", //"-coder", //"0", //"-bf", //"0", //"-flags2", //"fast", //"-wpredp", //"0", "-vpre", "lossless_ultrafast", "-vpre", "baseline", "-crf", "25", "-acodec", "libmp3lame", "-ar", "44100", "-deblockalpha", "0", "-deblockbeta", "0", "-r", "25", "-vb", "2000000", "-vf", "movie=/home/ted/Logo/aa-logo.png[wm];[in][wm]overlay=10:H-h-10[out]", "-f", fext, "-y", fname, NULL }; printf("\n\n****%s****\n\n",arg_list); //int n=sprintf (cmd, "ffmpeg.exe -i %s -vcodec %s -acodec %s -f %s -y %s", uri,vcodec,acodec,fext,fname); //int n=sprintf (cmd, "ffmpeg.exe -i %s -i aa.png -i pv.png -filter_complex 'overlay=10:H-h-10,overlay=W-w-10:H-h-10' -vcodec %s -b:v 200k -acodec %s -f %s -y %s", uri,vcodec,acodec,fext,fname); /* Spawn a child process running the “ls” command. Ignore the returned child process ID. */ /* Duplicate this process. */ child_pid = fork (); if (child_pid != 0){ /* This is the parent process. */ // setup Neptune logging //NPT_LogManager::GetDefault().Configure("plist:.level=INFO;.handlers=ConsoleHandler;.ConsoleHandler.colors=off;.ConsoleHandler.filter=63"); // Create upnp engine PLT_UPnP upnp; #ifdef SIMULATE_XBOX_360 // override default headers NPT_HttpClient::m_UserAgentHeader = "Xbox/2.0.8955.0 UPnP/1.0 Xbox/2.0.8955.0"; NPT_HttpServer::m_ServerHeader = "Xbox/2.0.8955.0 UPnP/1.0 Xbox/2.0.8955.0"; #endif #ifdef SIMULATE_PS3 // TODO: We need a way to add an extra header to all HTTP requests //X-AV-Client-Info: av=5.0; cn="Sony Computer Entertainment Inc."; mn="PLAYSTATION 3"; mv="1.0"; #endif // Create control point PLT_CtrlPointReference ctrlPoint(new PLT_CtrlPoint()); // Create controller PLT_MicroMediaController controller(ctrlPoint); #ifdef HAS_SERVER // create device PLT_DeviceHostReference server( new PLT_FileMediaServer("/home/ted/Music/", "Embedded Media Server")); server->m_ModelDescription = "Embedded File Media Server"; server->m_ModelURL = "http://www.plutinosoft.com/"; server->m_ModelNumber = "1.0"; server->m_ModelName = "Platinum File Media Server"; server->m_Manufacturer = "Plutinosoft"; server->m_ManufacturerURL = "http://www.plutinosoft.com/"; // add device upnp.AddDevice(server); NPT_String uuid = server->GetUUID(); //printf("****** surver name is: %s\n", uuid); // remove device uuid from ctrlpoint //ctrlPoint->IgnoreUUID(server->GetUUID()); #endif #ifdef HAS_RENDERER //create a device PLT_DeviceHostReference renderer( new PLT_MediaRenderer("Platinum Media Based \C5bo Test Transcoder", false, "e6572b54-f3c7-2d91-2fb5-b757f2537e21")); upnp.AddDevice(renderer); #endif // add control point to upnp engine and start it upnp.AddCtrlPoint(ctrlPoint); upnp.Start(); #ifdef BROADCAST_EXTRA // tell control point to perform extra broadcast discover every 6 secs // in case our device doesn't support multicast ctrlPoint->Discover(NPT_HttpUrl("255.255.255.255", 1900, "*"), "upnp:rootdevice", 1, NPT_TimeInterval(6.0)); ctrlPoint->Discover(NPT_HttpUrl("239.255.255.250", 1900, "*"), "upnp:rootdevice", 1, NPT_TimeInterval(6.0)); #endif #ifdef SIMULATE_XBOX_360 // create device PLT_DeviceHostReference xbox(new PLT_Xbox360("30848576-1775-2000-0000-00125a8fefad")); xbox->SetByeByeFirst(false); xbox->m_SerialNumber = "308485761776"; // add device upnp.AddDevice(xbox); ctrlPoint->IgnoreUUID(xbox->GetUUID()); // xbox issues a search for the content directory service // 10 secs after announcing itself to make sure // it got detected and inspected first ctrlPoint->Search( NPT_HttpUrl("239.255.255.250", 1900, "*"), "urn:schemas-microsoft-com:service:MSContentDirectory:1", 2, 10000, NPT_TimeInterval(10, 0)); ctrlPoint->Search( NPT_HttpUrl("239.255.255.250", 1900, "*"), "urn:schemas-upnp-org:service:ContentDirectory:1", 2, 10000, NPT_TimeInterval(10, 0)); #endif // start to process commands //controller.ProcessCommandLoop(); //upnp.m_Devices // stop everything //upnp.Stop(); //controller.DoEmbeddedServerCheck(); const char embeddedServerName[]="Embedded Media Server"; //PC as a renderer //const char mediaRendererName[]="XBMC: Media Renderer (192.168.11.3)"; //mina laptop //const char mediaRendererName[]="XBMC (ted-HP-2230s)"; //Raspbmc const char mediaRendererName[]="XBMC (raspbmc)"; controller.SetEmbeddedServer(embeddedServerName); controller.SetMediaRenderer(mediaRendererName); sleep(25); controller.HandleCmd_open(); sleep(1); controller.HandleCmd_play(); NPT_AutoLock lock(m_state); service->SetStateVariable("TransportState", "PLAYING"); service->SetStateVariable("TransportStatus", "OK"); service->SetStateVariable("AVTransportURI", uri); service->SetStateVariable("AVTransportURIMetaData", meta); //wait till play finished char buf[256]; while (gets(buf)) { if (*buf == 'q'){ kill( child_pid, SIGKILL ); break; } } // Wait until child process exits. //int child_status; wait(); upnp.Stop(); return NPT_SUCCESS; }else { /* Now execute PROGRAM, searching for it in the path. */ execvp ("ffmpeg", arg_list); /* The execvp function returns only if an error occurs. */ fprintf (stderr, "an error occurred in execvp\n"); abort (); } }
/*---------------------------------------------------------------------- | CUPnPRenderer::UpdateState +---------------------------------------------------------------------*/ void CUPnPRenderer::UpdateState() { NPT_AutoLock lock(m_state); PLT_Service *avt; if (NPT_FAILED(FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", avt))) return; /* don't update state while transitioning */ NPT_String state; avt->GetStateVariableValue("TransportState", state); if(state == "TRANSITIONING") return; avt->SetStateVariable("TransportStatus", "OK"); if (g_application.m_pPlayer->IsPlaying() || g_application.m_pPlayer->IsPausedPlayback()) { avt->SetStateVariable("NumberOfTracks", "1"); avt->SetStateVariable("CurrentTrack", "1"); std::string buffer = g_infoManager.GetCurrentPlayTime(TIME_FORMAT_HH_MM_SS); avt->SetStateVariable("RelativeTimePosition", buffer.c_str()); avt->SetStateVariable("AbsoluteTimePosition", buffer.c_str()); buffer = g_infoManager.GetDuration(TIME_FORMAT_HH_MM_SS); if (buffer.length() > 0) { avt->SetStateVariable("CurrentTrackDuration", buffer.c_str()); avt->SetStateVariable("CurrentMediaDuration", buffer.c_str()); } else { avt->SetStateVariable("CurrentTrackDuration", "00:00:00"); avt->SetStateVariable("CurrentMediaDuration", "00:00:00"); } } else if (g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW) { avt->SetStateVariable("TransportState", "PLAYING"); avt->SetStateVariable("AVTransportURI" , g_infoManager.GetPictureLabel(SLIDE_FILE_PATH).c_str()); avt->SetStateVariable("CurrentTrackURI", g_infoManager.GetPictureLabel(SLIDE_FILE_PATH).c_str()); avt->SetStateVariable("TransportPlaySpeed", "1"); CGUIWindowSlideShow *slideshow = g_windowManager.GetWindow<CGUIWindowSlideShow>(WINDOW_SLIDESHOW); if (slideshow) { std::string index; index = StringUtils::Format("%d", slideshow->NumSlides()); avt->SetStateVariable("NumberOfTracks", index.c_str()); index = StringUtils::Format("%d", slideshow->CurrentSlide()); avt->SetStateVariable("CurrentTrack", index.c_str()); } avt->SetStateVariable("CurrentTrackMetadata", ""); avt->SetStateVariable("AVTransportURIMetaData", ""); } else { avt->SetStateVariable("TransportState", "STOPPED"); avt->SetStateVariable("TransportPlaySpeed", "1"); avt->SetStateVariable("NumberOfTracks", "0"); avt->SetStateVariable("CurrentTrack", "0"); avt->SetStateVariable("RelativeTimePosition", "00:00:00"); avt->SetStateVariable("AbsoluteTimePosition", "00:00:00"); avt->SetStateVariable("CurrentTrackDuration", "00:00:00"); avt->SetStateVariable("CurrentMediaDuration", "00:00:00"); avt->SetStateVariable("NextAVTransportURI", ""); avt->SetStateVariable("NextAVTransportURIMetaData", ""); } }
/*---------------------------------------------------------------------- | PLT_MediaRenderer::SetupServices +---------------------------------------------------------------------*/ NPT_Result PLT_MediaRenderer::SetupServices(PLT_DeviceData& data) { PLT_Service* service; { /* AVTransport */ service = new PLT_Service( &data, "urn:schemas-upnp-org:service:AVTransport:1", "urn:upnp-org:serviceId:AVT_1-0", "urn:schemas-upnp-org:metadata-1-0/AVT/"); NPT_CHECK_FATAL(service->SetSCPDXML((const char*) RDR_AVTransportSCPD)); NPT_CHECK_FATAL(service->InitURLs("AVTransport", data.GetUUID())); NPT_CHECK_FATAL(data.AddService(service)); service->SetStateVariableRate("LastChange", NPT_TimeInterval(0.2f)); service->SetStateVariable("A_ARG_TYPE_InstanceID", "0"); // GetCurrentTransportActions service->SetStateVariable("CurrentTransportActions", "Play,Pause,Stop,Seek,Next,Previous"); // GetDeviceCapabilities service->SetStateVariable("PossiblePlaybackStorageMedia", "NONE,NETWORK"); service->SetStateVariable("PossibleRecordStorageMedia", "NOT_IMPLEMENTED"); service->SetStateVariable("PossibleRecordQualityModes", "NOT_IMPLEMENTED"); // GetMediaInfo service->SetStateVariable("NumberOfTracks", "0"); service->SetStateVariable("CurrentMediaDuration", "00:00:00");; service->SetStateVariable("AVTransportURI", ""); service->SetStateVariable("AVTransportURIMetadata", "");; service->SetStateVariable("NextAVTransportURI", "NOT_IMPLEMENTED"); service->SetStateVariable("NextAVTransportURIMetadata", "NOT_IMPLEMENTED"); service->SetStateVariable("PlaybackStorageMedium", "NONE"); service->SetStateVariable("RecordStorageMedium", "NOT_IMPLEMENTED"); service->SetStateVariable("RecordMediumWriteStatus", "NOT_IMPLEMENTED"); // GetPositionInfo service->SetStateVariable("CurrentTrack", "0"); service->SetStateVariable("CurrentTrackDuration", "00:00:00"); service->SetStateVariable("CurrentTrackMetadata", ""); service->SetStateVariable("CurrentTrackURI", ""); service->SetStateVariable("RelativeTimePosition", "00:00:00"); service->SetStateVariable("AbsoluteTimePosition", "00:00:00"); service->SetStateVariable("RelativeCounterPosition", "2147483647"); // means NOT_IMPLEMENTED service->SetStateVariable("AbsoluteCounterPosition", "2147483647"); // means NOT_IMPLEMENTED // disable indirect eventing for certain state variables PLT_StateVariable* var; var = service->FindStateVariable("RelativeTimePosition"); if (var) var->DisableIndirectEventing(); var = service->FindStateVariable("AbsoluteTimePosition"); if (var) var->DisableIndirectEventing(); var = service->FindStateVariable("RelativeCounterPosition"); if (var) var->DisableIndirectEventing(); var = service->FindStateVariable("AbsoluteCounterPosition"); if (var) var->DisableIndirectEventing(); // GetTransportInfo service->SetStateVariable("TransportState", "NO_MEDIA_PRESENT"); service->SetStateVariable("TransportStatus", "OK"); service->SetStateVariable("TransportPlaySpeed", "1"); // GetTransportSettings service->SetStateVariable("CurrentPlayMode", "NORMAL"); service->SetStateVariable("CurrentRecordQualityMode", "NOT_IMPLEMENTED"); } { /* ConnectionManager */ service = new PLT_Service( &data, "urn:schemas-upnp-org:service:ConnectionManager:1", "urn:upnp-org:serviceId:CMGR_1-0"); NPT_CHECK_FATAL(service->SetSCPDXML((const char*) RDR_ConnectionManagerSCPD)); NPT_CHECK_FATAL(service->InitURLs("ConnectionManager", data.GetUUID())); NPT_CHECK_FATAL(data.AddService(service)); service->SetStateVariable("CurrentConnectionIDs", "0"); // put all supported mime types here instead service->SetStateVariable("SinkProtocolInfo", "http-get:*:*:*"); service->SetStateVariable("SourceProtocolInfo", ""); } { /* RenderingControl */ service = new PLT_Service( &data, "urn:schemas-upnp-org:service:RenderingControl:1", "urn:upnp-org:serviceId:RCS_1-0", "urn:schemas-upnp-org:metadata-1-0/RCS/"); NPT_CHECK_FATAL(service->SetSCPDXML((const char*) RDR_RenderingControlSCPD)); NPT_CHECK_FATAL(service->InitURLs("RenderingControl", data.GetUUID())); NPT_CHECK_FATAL(data.AddService(service)); service->SetStateVariableRate("LastChange", NPT_TimeInterval(0.2f)); service->SetStateVariable("Mute", "0"); service->SetStateVariable("Volume", "100"); } return NPT_SUCCESS; }