if (m_decoder)
{
m_decoder->setVideoPID(vpid);
+ m_current_audio_stream = 0;
m_decoder->setAudioPID(apid, apidtype);
if (!m_is_pvr)
m_decoder->setSyncPCR(pcrpid);
if (m_service_handler.getPVRChannel(pvr_channel))
return -1;
- /* this is of couse wrong: PTS values don't match with bytes. */
- return pvr_channel->seekToPosition(SEEK_CUR, direction * to);
+ to *= direction;
+
+ ePtr<iDVBDemux> demux;
+ m_service_handler.getDemux(demux);
+ if (!demux)
+ return -1;
+
+ return pvr_channel->seekTo(demux, 1, to);
}
RESULT eDVBServicePlay::getPlayPosition(pts_t &pos)
if (m_service_handler.getPVRChannel(pvr_channel))
return -1;
- return pvr_channel->getCurrentPosition(pos);
+ ePtr<iDVBDemux> demux;
+ m_service_handler.getDemux(demux);
+ if (!demux)
+ return -1;
+
+ return pvr_channel->getCurrentPosition(demux, pos);
}
RESULT eDVBServicePlay::info(ePtr<iServiceInformation> &ptr)
return m_event_handler.getEvent(evt, nownext);
}
+int eDVBServicePlay::getInfo(int w)
+{
+ eDVBServicePMTHandler::program program;
+
+ if (m_service_handler.getProgramInfo(program))
+ return -1;
+
+ switch (w)
+ {
+ case sVideoPID: if (program.videoStreams.empty()) return -1; return program.videoStreams[0].pid;
+ case sAudioPID: if (program.audioStreams.empty()) return -1; return program.audioStreams[m_current_audio_stream].pid;
+ case sPCRPID: return program.pcrPid;
+ case sPMTPID: return program.pmtPid;
+ case sTXTPID: return -1;
+
+ case sSID: return ((const eServiceReferenceDVB&)m_reference).getServiceID().get();
+ case sONID: return ((const eServiceReferenceDVB&)m_reference).getOriginalNetworkID().get();
+ case sTSID: return ((const eServiceReferenceDVB&)m_reference).getTransportStreamID().get();
+ case sNamespace: return ((const eServiceReferenceDVB&)m_reference).getDVBNamespace().get();
+ case sProvider: if (!m_dvb_service) return -1; return -2;
+ default:
+ return -1;
+ }
+}
+
+std::string eDVBServicePlay::getInfoString(int w)
+{
+ switch (w)
+ {
+ case sProvider:
+ if (!m_dvb_service) return "";
+ return m_dvb_service->m_provider_name;
+ default:
+ return "";
+ }
+}
+
int eDVBServicePlay::getNumberOfTracks()
{
eDVBServicePMTHandler::program program;
RESULT eDVBServicePlay::selectTrack(unsigned int i)
{
+ int ret = selectAudioStream(i);
+
+ if (m_decoder->start())
+ return -5;
+
+ return ret;
+}
+
+RESULT eDVBServicePlay::getTrackInfo(struct iAudioTrackInfo &info, unsigned int i)
+{
eDVBServicePMTHandler::program program;
if (m_service_handler.getProgramInfo(program))
if (i >= program.audioStreams.size())
return -2;
- if (!m_decoder)
- return -3;
+ if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atMPEG)
+ info.m_description = "MPEG";
+ else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atAC3)
+ info.m_description = "AC3";
+ else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atDTS)
+ info.m_description = "DTS";
+ else
+ info.m_description = "???";
- if (m_decoder->setAudioPID(program.audioStreams[i].pid, program.audioStreams[i].type))
- return -4;
+ /* CHECK here for component tag override. */
+ info.m_language = program.audioStreams[i].language_code;
return 0;
}
-RESULT eDVBServicePlay::getTrackInfo(struct iAudioTrackInfo &info, unsigned int i)
+int eDVBServicePlay::selectAudioStream(int i)
{
eDVBServicePMTHandler::program program;
if (i >= program.audioStreams.size())
return -2;
- if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atMPEG)
- info.m_description = "MPEG";
- else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atAC3)
- info.m_description = "AC3";
- else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atDTS)
- info.m_description = "DTS";
- else
- info.m_description = "???";
+ if (!m_decoder)
+ return -3;
+ if (m_decoder->setAudioPID(program.audioStreams[i].pid, program.audioStreams[i].type))
+ return -4;
+
+ m_current_audio_stream = i;
+
return 0;
}