diff --git a/src/nhttpd/tuxboxapi/coolstream/neutrinoyparser.cpp b/src/nhttpd/tuxboxapi/coolstream/neutrinoyparser.cpp index 9ada60023..d2219e8e7 100644 --- a/src/nhttpd/tuxboxapi/coolstream/neutrinoyparser.cpp +++ b/src/nhttpd/tuxboxapi/coolstream/neutrinoyparser.cpp @@ -563,68 +563,109 @@ std::string CNeutrinoYParser::func_get_audio_pids_as_dropdown(CyhookHandler *, std::string yresult; static bool init_iso=true; bool idx_as_id=true; - + unsigned int selected_apid = 0; + t_channel_id current_channel_id = 0; + CZapitChannel * channel = NULL; if(para == "apid") idx_as_id=false; + else if(!para.empty() && ("channel="== para.substr(0,8))){ + if (sscanf(para.c_str(), "channel=%llx:audio=%i:", ¤t_channel_id,&selected_apid) == 2) { + if(current_channel_id != 0 && CZapit::getInstance()->GetCurrentChannelID() != current_channel_id){ + channel = CServiceManager::getInstance()->FindChannel(current_channel_id); + } + } + } if(init_iso) { if(_initialize_iso639_map()) init_iso=false; } - bool eit_not_ok=true; - CZapitClient::responseGetPIDs pids; + if (channel){//check audio pid if current_channel != vlc live channel + //wait for channel lock + for (int i = 0; i < 30 && channel->getAudioChannelCount()==0;i++){ + usleep(100000); + } + for (unsigned int i = 0; i < channel->getAudioChannelCount(); i++) { + CZapitAudioChannel::ZapitAudioChannelType atype = channel->getAudioChannel(i)->audioChannelType; + std::string a_desc; + if(!(init_iso)){ + a_desc = _getISO639Description( channel->getAudioChannel(i)->description.c_str() ); + }else{ + a_desc = channel->getAudioChannel(i)->description.c_str(); + } + if (channel->getAudioChannel(i)->audioChannelType == CZapitAudioChannel::EAC3) { + yresult += string_printf("\r\n",i + , (i==selected_apid) ? "selected=\"selected\"" : "" + , a_desc.c_str() + ,"(EAC3)"); + } else { + yresult += string_printf("\r\n",i + , (i==selected_apid) ? "selected=\"selected\"" : "" + ,a_desc.c_str() + ,atype?"(AC3)":" "); + } + } + } + if( yresult.empty()){ + bool eit_not_ok=true; + if(current_channel_id==0) + current_channel_id = CZapit::getInstance()->GetCurrentChannelID(); - CSectionsdClient::ComponentTagList tags; - pids.PIDs.vpid=0; - NeutrinoAPI->Zapit->getPIDS(pids); + CZapitClient::responseGetPIDs pids; + CSectionsdClient::ComponentTagList tags; + pids.PIDs.vpid=0; + NeutrinoAPI->Zapit->getPIDS(pids); - t_channel_id current_channel = CZapit::getInstance()->GetCurrentChannelID(); - CSectionsdClient::responseGetCurrentNextInfoChannelID currentNextInfo; - CEitManager::getInstance()->getCurrentNextServiceKey(current_channel, currentNextInfo); - if (CEitManager::getInstance()->getComponentTagsUniqueKey(currentNextInfo.current_uniqueKey,tags)) - { - for (unsigned int i=0; i< tags.size(); i++) + CSectionsdClient::responseGetCurrentNextInfoChannelID currentNextInfo; + CEitManager::getInstance()->getCurrentNextServiceKey(current_channel_id, currentNextInfo); + if (CEitManager::getInstance()->getComponentTagsUniqueKey(currentNextInfo.current_uniqueKey,tags)) { - for (unsigned short j=0; j< pids.APIDs.size(); j++) + unsigned int tag = 0; + for (unsigned int i=0; i< tags.size(); i++) { - if ( pids.APIDs[j].component_tag == tags[i].componentTag ) + for (unsigned short j=0; j< pids.APIDs.size(); j++) { - if(!tags[i].component.empty()) + if ( pids.APIDs[j].component_tag == tags[i].componentTag ) { - if(!(isalnum(tags[i].component[0]))) - tags[i].component=tags[i].component.substr(1,tags[i].component.length()-1); - yresult += string_printf("\r\n",idx_as_id ? j : pids.APIDs[j].pid,tags[i].component.c_str()); - } - else - { - if(!(init_iso)) + if(!tags[i].component.empty()) { - strcpy( pids.APIDs[j].desc, _getISO639Description( pids.APIDs[j].desc ) ); + if(!(isalnum(tags[i].component[0]))) + tags[i].component=tags[i].component.substr(1,tags[i].component.length()-1); + yresult += string_printf("\r\n",idx_as_id ? j : pids.APIDs[j].pid,(tag==selected_apid) ? "selected=\"selected\"" : "",tags[i].component.c_str()); + tag++; } - yresult += string_printf("\r\n",idx_as_id ? j : pids.APIDs[j].pid,std::string(pids.APIDs[j].desc).c_str(),pids.APIDs[j].is_ac3 ? " (AC3)": pids.APIDs[j].is_aac ? "(AAC)" : pids.APIDs[j].is_eac3 ? "(EAC3)" : " "); + else + { + if(!(init_iso)) + { + strcpy( pids.APIDs[j].desc, _getISO639Description( pids.APIDs[j].desc ) ); + } + yresult += string_printf("\r\n",idx_as_id ? j : pids.APIDs[j].pid,(j==selected_apid) ? "selected=\"selected\"" : "",std::string(pids.APIDs[j].desc).c_str(),pids.APIDs[j].is_ac3 ? " (AC3)": pids.APIDs[j].is_aac ? "(AAC)" : pids.APIDs[j].is_eac3 ? "(EAC3)" : " "); + } + eit_not_ok=false; + break; } - eit_not_ok=false; - break; } } } - } - if(eit_not_ok) - { - unsigned short i = 0; - for (CZapitClient::APIDList::iterator it = pids.APIDs.begin(); it!=pids.APIDs.end(); ++it) + if(eit_not_ok) { - if(!(init_iso)) + unsigned short i = 0; + for (CZapitClient::APIDList::iterator it = pids.APIDs.begin(); it!=pids.APIDs.end(); ++it) { - strcpy( pids.APIDs[i].desc, _getISO639Description( pids.APIDs[i].desc ) ); + if(!(init_iso)) + { + strcpy( pids.APIDs[i].desc, _getISO639Description( pids.APIDs[i].desc ) ); + } + yresult += string_printf("\r\n", + idx_as_id ? i : it->pid, (i==selected_apid) ? "selected=\"selected\"" : "",pids.APIDs[i].desc, + pids.APIDs[i].is_ac3 ? " (AC3)": pids.APIDs[i].is_aac ? "(AAC)" : pids.APIDs[i].is_eac3 ? "(EAC3)" : " "); + i++; } - yresult += string_printf("\r\n",idx_as_id ? i : it->pid,pids.APIDs[i].desc,pids.APIDs[i].is_ac3 ? " (AC3)": pids.APIDs[i].is_aac ? "(AAC)" : pids.APIDs[i].is_eac3 ? "(EAC3)" : " "); - i++; } + if(pids.APIDs.empty()) + yresult = "00000"; // shouldnt happen, but print at least one apid } - - if(pids.APIDs.empty()) - yresult = "00000"; // shouldnt happen, but print at least one apid return yresult; } diff --git a/src/nhttpd/web/Y_Live.js b/src/nhttpd/web/Y_Live.js index 77ae189d3..7b9144088 100644 --- a/src/nhttpd/web/Y_Live.js +++ b/src/nhttpd/web/Y_Live.js @@ -329,7 +329,7 @@ function doChangeAudioPid(){ window.setTimeout("change_channel_play()",100); } function build_audio_pid_list(){ - var audio_pids_url = "/y/cgi?execute=func:get_audio_pids_as_dropdown"; + var audio_pids_url = "/y/cgi?execute=func:get_audio_pids_as_dropdown%20channel="+current_channel+":audio="+AudioChannel+":"; var audio_pid_list = loadSyncURL(audio_pids_url); audio_pid_list = "