X-Git-Url: http://code.vuplus.com/gitweb/?a=blobdiff_plain;f=lib%2Fservice%2Fservicedvb.cpp;h=2889ad303ff07bdaa4e96f6e14071a6d1197183b;hb=f7826b7569f779fde77e6aeb9ea384289e834497;hp=558bf0c22cd0273428aa24577915a72b6182df3c;hpb=be533a7e21618d31831e8c2ecc4898dfe5c4edcc;p=vuplus_dvbapp diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp old mode 100644 new mode 100755 index 558bf0c..07827ec --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -17,6 +17,7 @@ #include #include #include // access to python config +#include /* for subtitles */ #include @@ -89,9 +90,10 @@ int eStaticServiceDVBInformation::isPlayable(const eServiceReference &ref, const else { eDVBChannelID chid, chid_ignore; + int system; ((const eServiceReferenceDVB&)ref).getChannelID(chid); ((const eServiceReferenceDVB&)ignore).getChannelID(chid_ignore); - return res_mgr->canAllocateChannel(chid, chid_ignore); + return res_mgr->canAllocateChannel(chid, chid_ignore, system); } return false; } @@ -239,23 +241,24 @@ int eStaticServiceDVBBouquetInformation::isPlayable(const eServiceReference &ref { 1, 2, 3 }, // -T -C -S { 2, 1, 3 } // -T -S -C }; + int system; ((const eServiceReferenceDVB&)*it).getChannelID(chid); - int tmp=res->canAllocateChannel(chid, chid_ignore, simulate); - switch(tmp) + int tmp = res->canAllocateChannel(chid, chid_ignore, system, simulate); + if (tmp > 0) { - case 0: - break; - case 30000: // cached DVB-T channel - case 1: // DVB-T frontend - tmp = prio_map[prio_order][2]; - break; - case 40000: // cached DVB-C channel - case 2: - tmp = prio_map[prio_order][1]; - break; - default: // DVB-S - tmp = prio_map[prio_order][0]; - break; + switch (system) + { + case iDVBFrontend::feTerrestrial: + tmp = prio_map[prio_order][2]; + break; + case iDVBFrontend::feCable: + tmp = prio_map[prio_order][1]; + break; + default: + case iDVBFrontend::feSatellite: + tmp = prio_map[prio_order][0]; + break; + } } if (tmp > cur) { @@ -292,7 +295,7 @@ public: RESULT getName(const eServiceReference &ref, std::string &name); int getLength(const eServiceReference &ref); RESULT getEvent(const eServiceReference &ref, ePtr &SWIG_OUTPUT, time_t start_time); - int isPlayable(const eServiceReference &ref, const eServiceReference &ignore) { return 1; } + int isPlayable(const eServiceReference &ref, const eServiceReference &ignore, bool simulate) { return 1; } int getInfo(const eServiceReference &ref, int w); std::string getInfoString(const eServiceReference &ref,int w); PyObject *getInfoObject(const eServiceReference &r, int what); @@ -309,7 +312,9 @@ eStaticServiceDVBPVRInformation::eStaticServiceDVBPVRInformation(const eServiceR RESULT eStaticServiceDVBPVRInformation::getName(const eServiceReference &ref, std::string &name) { ASSERT(ref == m_ref); - if (m_parser.m_name.size()) + if (!ref.name.empty()) + name = ref.name; + else if (!m_parser.m_name.empty()) name = m_parser.m_name; else { @@ -402,14 +407,25 @@ RESULT eStaticServiceDVBPVRInformation::getEvent(const eServiceReference &ref, e { if (!ref.path.empty()) { - ePtr event = new eServiceEvent; - std::string filename = ref.path; - filename.erase(filename.length()-2, 2); - filename+="eit"; - if (!event->parseFrom(filename, (m_parser.m_ref.getTransportStreamID().get()<<16)|m_parser.m_ref.getOriginalNetworkID().get())) + if (ref.path.substr(0, 7) == "http://") { - evt = event; - return 0; + eServiceReference equivalentref(ref); + /* this might be a scrambled stream (id + 0x100), force equivalent dvb type */ + equivalentref.type = eServiceFactoryDVB::id; + equivalentref.path.clear(); + return eEPGCache::getInstance()->lookupEventTime(equivalentref, start_time, evt); + } + else + { + ePtr event = new eServiceEvent; + std::string filename = ref.path; + filename.erase(filename.length()-2, 2); + filename+="eit"; + if (!event->parseFrom(filename, (m_parser.m_ref.getTransportStreamID().get()<<16)|m_parser.m_ref.getOriginalNetworkID().get())) + { + evt = event; + return 0; + } } } evt = 0; @@ -503,18 +519,19 @@ RESULT eDVBPVRServiceOfflineOperations::reindex() int err = f.open(m_ref.path.c_str(), 0); if (err < 0) return -1; - + + off_t offset = 0; off_t length = f.length(); unsigned char buffer[188*256*4]; while (1) { - off_t offset = f.lseek(0, SEEK_CUR); eDebug("at %08llx / %08llx (%d %%)", offset, length, (int)(offset * 100 / length)); - int r = f.read(buffer, sizeof(buffer)); + int r = f.read(offset, buffer, sizeof(buffer)); if (!r) break; if (r < 0) return r; + offset += r; parser.parseData(offset, buffer, r); } @@ -813,6 +830,12 @@ RESULT eServiceFactoryDVB::record(const eServiceReference &ref, ePtr &service, const eServ /* we are sure to have a ..DVB reference as the info() call was forwarded here according to it's ID. */ if ((err = db->getService((eServiceReferenceDVB&)ref, service)) != 0) { - eDebug("getService failed!"); +// eDebug("getService failed!"); return err; } } @@ -910,11 +933,12 @@ RESULT eServiceFactoryDVB::lookupService(ePtr &service, const eServ return 0; } -eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *service): +eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *service): m_reference(ref), m_dvb_service(service), m_have_video_pid(0), m_is_paused(0) { m_is_primary = 1; - m_is_pvr = !m_reference.path.empty(); + m_is_stream = m_reference.path.substr(0, 7) == "http://"; + m_is_pvr = (!m_reference.path.empty() && !m_is_stream); m_timeshift_enabled = m_timeshift_active = 0, m_timeshift_changed = 0; m_skipmode = m_fastforward = m_slowmotion = 0; @@ -932,6 +956,8 @@ eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *serv m_subtitle_sync_timer = eTimer::create(eApp); + m_current_video_pid_type = 0; + CONNECT(m_subtitle_sync_timer->timeout, eDVBServicePlay::checkSubtitleTiming); } @@ -1021,12 +1047,13 @@ void eDVBServicePlay::serviceEvent(int event) updateTimeshiftPids(); if (!m_timeshift_active) updateDecoder(); - if (m_first_program_info && m_is_pvr) + if (m_first_program_info & 1 && m_is_pvr) { - m_first_program_info = 0; + m_first_program_info &= ~1; seekTo(0); } - m_event((iPlayableService*)this, evUpdatedInfo); + if (!m_timeshift_active) + m_event((iPlayableService*)this, evUpdatedInfo); break; } case eDVBServicePMTHandler::eventPreStart: @@ -1038,6 +1065,9 @@ void eDVBServicePlay::serviceEvent(int event) case eDVBServicePMTHandler::eventSOF: m_event((iPlayableService*)this, evSOF); break; + case eDVBServicePMTHandler::eventHBBTVInfo: + m_event((iPlayableService*)this, evHBBTVInfo); + break; } } @@ -1046,17 +1076,87 @@ void eDVBServicePlay::serviceEventTimeshift(int event) switch (event) { case eDVBServicePMTHandler::eventNewProgramInfo: + eDebug("eventNewProgramInfo TS"); if (m_timeshift_active) + { updateDecoder(); + if (m_first_program_info & 2) + { + if (m_slowmotion) + { + eDebug("re-apply slowmotion after timeshift file change"); + m_decoder->setSlowMotion(m_slowmotion); + } + if (m_fastforward) + { + eDebug("re-apply skip %d, ratio %d after timeshift file change", m_skipmode, m_fastforward); + if (m_skipmode) + m_cue->setSkipmode(m_skipmode * 90000); /* convert to 90000 per second */ + if (m_fastforward != 1) + m_decoder->setFastForward(m_fastforward); + else + m_decoder->setTrickmode(); + } + else + seekTo(0); + m_first_program_info &= ~2; + } + m_event((iPlayableService*)this, evUpdatedInfo); + } break; case eDVBServicePMTHandler::eventSOF: - m_event((iPlayableService*)this, evSOF); +#if 0 + if (!m_timeshift_file_next.empty()) + { + eDebug("timeshift SOF, switch to next file"); + m_decoder->pause(); + + m_first_program_info |= 2; + + eServiceReferenceDVB r = (eServiceReferenceDVB&)m_reference; + r.path = m_timeshift_file_next; + + /* free the timeshift service handler, we need the resources */ + m_service_handler_timeshift.free(); + resetTimeshift(1); + + if (m_skipmode < 0) + m_cue->seekTo(0, -1000); + ePtr source = createTsSource(r); + m_service_handler_timeshift.tuneExt(r, 1, source, r.path.c_str(), m_cue, 0, m_dvb_service); /* use the decoder demux for everything */ + + m_event((iPlayableService*)this, evUser+1); + } + else +#endif + m_event((iPlayableService*)this, evSOF); break; case eDVBServicePMTHandler::eventEOF: if ((!m_is_paused) && (m_skipmode >= 0)) { - eDebug("timeshift EOF, so let's go live"); - switchToLive(); + if (m_timeshift_file_next.empty()) + { + eDebug("timeshift EOF, so let's go live"); + switchToLive(); + } + else + { + eDebug("timeshift EOF, switch to next file"); + + m_first_program_info |= 2; + + eServiceReferenceDVB r = (eServiceReferenceDVB&)m_reference; + r.path = m_timeshift_file_next; + + /* free the timeshift service handler, we need the resources */ + m_service_handler_timeshift.free(); + resetTimeshift(1); + + ePtr source = createTsSource(r); + m_service_handler_timeshift.tuneExt(r, 1, source, m_timeshift_file_next.c_str(), m_cue, 0, m_dvb_service); /* use the decoder demux for everything */ + + m_event((iPlayableService*)this, evUser+1); + } } break; } @@ -1083,7 +1183,8 @@ RESULT eDVBServicePlay::start() m_event(this, evStart); m_first_program_info = 1; - m_service_handler.tune(service, m_is_pvr, m_cue, false, m_dvb_service); + ePtr source = createTsSource(service); + m_service_handler.tuneExt(service, m_is_pvr, source, service.path.c_str(), m_cue, false, m_dvb_service, m_is_stream); if (m_is_pvr) { @@ -1225,7 +1326,18 @@ RESULT eDVBServicePlay::setFastForward_internal(int ratio, bool final_seek) { eDebug("setting cue skipmode to %d", skipmode); if (m_cue) - m_cue->setSkipmode(skipmode * 90000); /* convert to 90000 per second */ + { + long long _skipmode = skipmode; + if (m_current_video_pid_type == eDVBServicePMTHandler::videoStream::vtH265_HEVC) + { + if (ratio < 0) + _skipmode = skipmode * 3; + else + _skipmode = skipmode * 4; + } + + m_cue->setSkipmode(_skipmode * 90000); /* convert to 90000 per second */ + } } m_skipmode = skipmode; @@ -1427,7 +1539,7 @@ RESULT eDVBServicePlay::timeshift(ePtr &ptr) { ptr = 0; if (m_have_video_pid && // HACK !!! FIXMEE !! temporary no timeshift on radio services !! - (m_timeshift_enabled || !m_is_pvr)) + (m_timeshift_enabled || (!m_is_pvr&&!m_is_stream))) { if (!m_timeshift_enabled) { @@ -1494,6 +1606,18 @@ RESULT eDVBServicePlay::getName(std::string &name) ePtr i = new eStaticServiceDVBPVRInformation(m_reference); return i->getName(m_reference, name); } + else if (m_is_stream) + { + name = m_reference.name; + if (name.empty()) + { + name = m_reference.path; + } + if (name.empty()) + { + name = "(...)"; + } + } else if (m_dvb_service) { m_dvb_service->getName(m_reference, name); @@ -1516,7 +1640,7 @@ int eDVBServicePlay::getInfo(int w) { eDVBServicePMTHandler::program program; - if (w == sCAIDs) + if (w == sCAIDs || w == sCAIDPIDs) return resIsPyObject; eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler; @@ -1605,12 +1729,21 @@ int eDVBServicePlay::getInfo(int w) case sAudioPID: if (m_dvb_service) { - int apid = m_dvb_service->getCacheEntry(eDVBService::cAPID); + int apid = m_dvb_service->getCacheEntry(eDVBService::cMPEGAPID); if (apid != -1) return apid; apid = m_dvb_service->getCacheEntry(eDVBService::cAC3PID); if (apid != -1) return apid; + apid = m_dvb_service->getCacheEntry(eDVBService::cDDPPID); + if (apid != -1) + return apid; + apid = m_dvb_service->getCacheEntry(eDVBService::cAACHEAPID); + if (apid != -1) + return apid; + apid = m_dvb_service->getCacheEntry(eDVBService::cAACAPID); + if (apid != -1) + return apid; } if (no_program_info) return -1; if (program.audioStreams.empty()) return -1; return program.audioStreams[0].pid; case sPCRPID: @@ -1645,6 +1778,23 @@ std::string eDVBServicePlay::getInfoString(int w) return m_dvb_service->m_provider_name; case sServiceref: return m_reference.toString(); + case sHBBTVUrl: + { + std::string url; + eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler; + h.getHBBTVUrl(url); + return url; + } + case sLiveStreamDemuxId: + { + int id; + eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler; + h.getDemuxID(id); + + std::string demux; + demux += id + '0'; + return demux; + } default: break; } @@ -1657,8 +1807,15 @@ PyObject *eDVBServicePlay::getInfoObject(int w) { case sCAIDs: return m_service_handler.getCaIds(); + case sCAIDPIDs: + return m_service_handler.getCaIds(true); case sTransponderData: return eStaticServiceDVBInformation().getInfoObject(m_reference, w); + case sHBBTVUrl: + { + eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler; + return h.getHbbTVApplications(); + } default: break; } @@ -1717,13 +1874,17 @@ RESULT eDVBServicePlay::getTrackInfo(struct iAudioTrackInfo &info, unsigned int 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"; + info.m_description = "Dolby Digital"; + else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atDDP) + info.m_description = "Dolby Digital+"; else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atAAC) info.m_description = "AAC"; else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atAACHE) info.m_description = "AAC-HE"; else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atDTS) info.m_description = "DTS"; + else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atDTSHD) + info.m_description = "DTS-HD"; else info.m_description = "???"; @@ -1814,23 +1975,17 @@ int eDVBServicePlay::selectAudioStream(int i) case the real default is not yet available.) */ if (m_dvb_service && ((i != -1) - || ((m_dvb_service->getCacheEntry(eDVBService::cAPID) == -1) && (m_dvb_service->getCacheEntry(eDVBService::cAC3PID)==-1)))) + || ((m_dvb_service->getCacheEntry(eDVBService::cMPEGAPID) == -1) + && (m_dvb_service->getCacheEntry(eDVBService::cAC3PID)==-1) + && (m_dvb_service->getCacheEntry(eDVBService::cDDPPID)==-1) + && (m_dvb_service->getCacheEntry(eDVBService::cAACHEAPID)==-1) + && (m_dvb_service->getCacheEntry(eDVBService::cAACAPID)==-1)))) { - if (apidtype == eDVBAudio::aMPEG) - { - m_dvb_service->setCacheEntry(eDVBService::cAPID, apid); - m_dvb_service->setCacheEntry(eDVBService::cAC3PID, -1); - } - else if (apidtype == eDVBAudio::aAC3) - { - m_dvb_service->setCacheEntry(eDVBService::cAPID, -1); - m_dvb_service->setCacheEntry(eDVBService::cAC3PID, apid); - } - else - { - m_dvb_service->setCacheEntry(eDVBService::cAPID, -1); - m_dvb_service->setCacheEntry(eDVBService::cAC3PID, -1); - } + m_dvb_service->setCacheEntry(eDVBService::cMPEGAPID, apidtype == eDVBAudio::aMPEG ? apid : -1); + m_dvb_service->setCacheEntry(eDVBService::cAC3PID, apidtype == eDVBAudio::aAC3 ? apid : -1); + m_dvb_service->setCacheEntry(eDVBService::cDDPPID, apidtype == eDVBAudio::aDDP ? apid : -1); + m_dvb_service->setCacheEntry(eDVBService::cAACHEAPID, apidtype == eDVBAudio::aAACHE ? apid : -1); + m_dvb_service->setCacheEntry(eDVBService::cAACAPID, apidtype == eDVBAudio::aAAC ? apid : -1); } h.resetCachedProgram(); @@ -2076,6 +2231,8 @@ RESULT eDVBServicePlay::startTimeshift() } m_record->setTargetFD(m_timeshift_fd); + m_record->setTargetFilename(m_timeshift_file.c_str()); + m_record->enableAccessPoints(false); m_timeshift_enabled = 1; @@ -2101,6 +2258,11 @@ RESULT eDVBServicePlay::stopTimeshift(bool swToLive) close(m_timeshift_fd); eDebug("remove timeshift file"); eBackgroundFileEraser::getInstance()->erase(m_timeshift_file.c_str()); + + { + std::string timeshift_file_sc = m_timeshift_file + ".sc"; + eBackgroundFileEraser::getInstance()->erase(timeshift_file_sc.c_str()); + } return 0; } @@ -2197,6 +2359,8 @@ void eDVBServicePlay::updateTimeshiftPids() return; else { + int timing_pid = -1; + int timing_pid_type = -1; std::set pids_to_record; pids_to_record.insert(0); // PAT if (program.pmtPid != -1) @@ -2208,12 +2372,28 @@ void eDVBServicePlay::updateTimeshiftPids() for (std::vector::const_iterator i(program.videoStreams.begin()); i != program.videoStreams.end(); ++i) + { pids_to_record.insert(i->pid); + if (timing_pid == -1) + { + timing_pid = i->pid; + timing_pid_type = i->type; + } + } + for (std::vector::const_iterator i(program.audioStreams.begin()); i != program.audioStreams.end(); ++i) - pids_to_record.insert(i->pid); + { + pids_to_record.insert(i->pid); + + if (timing_pid == -1) + { + timing_pid = i->pid; + timing_pid_type = -1; + } + } for (std::vector::const_iterator i(program.subtitleStreams.begin()); @@ -2237,41 +2417,38 @@ void eDVBServicePlay::updateTimeshiftPids() for (std::set::iterator i(obsolete_pids.begin()); i != obsolete_pids.end(); ++i) m_record->removePID(*i); + + if (timing_pid != -1) + m_record->setTimingPID(timing_pid, timing_pid_type); } } +RESULT eDVBServicePlay::setNextPlaybackFile(const char *f) +{ + m_timeshift_file_next = f; + return 0; +} + void eDVBServicePlay::switchToLive() { if (!m_timeshift_active) return; - + eDebug("SwitchToLive"); - - m_cue = 0; - m_decoder = 0; - m_decode_demux = 0; - m_teletext_parser = 0; - m_rds_decoder = 0; - m_subtitle_parser = 0; - m_new_dvb_subtitle_page_connection = 0; - m_new_subtitle_page_connection = 0; - m_rds_decoder_event_connection = 0; - m_video_event_connection = 0; + + resetTimeshift(0); + m_is_paused = m_skipmode = m_fastforward = m_slowmotion = 0; /* not supported in live mode */ - /* free the timeshift service handler, we need the resources */ + /* free the timeshift service handler, we need the resources */ m_service_handler_timeshift.free(); - m_timeshift_active = 0; - m_timeshift_changed = 1; updateDecoder(true); } -void eDVBServicePlay::switchToTimeshift() +void eDVBServicePlay::resetTimeshift(int start) { - if (m_timeshift_active) - return; - + m_cue = 0; m_decode_demux = 0; m_decoder = 0; m_teletext_parser = 0; @@ -2281,16 +2458,48 @@ void eDVBServicePlay::switchToTimeshift() m_new_dvb_subtitle_page_connection = 0; m_rds_decoder_event_connection = 0; m_video_event_connection = 0; - - m_timeshift_active = 1; m_timeshift_changed = 1; + m_timeshift_file_next.clear(); + + if (start) + { + m_cue = new eCueSheet(); + m_timeshift_active = 1; + } + else + m_timeshift_active = 0; +} + +ePtr eDVBServicePlay::createTsSource(eServiceReferenceDVB &ref) +{ + if (m_is_stream) + { + eHttpStream *f = new eHttpStream(); + f->open(ref.path.c_str()); + return ePtr(f); + } + else + { + eRawFile *f = new eRawFile(); + f->open(ref.path.c_str()); + return ePtr(f); + } +} + +void eDVBServicePlay::switchToTimeshift() +{ + if (m_timeshift_active) + return; + + resetTimeshift(1); eServiceReferenceDVB r = (eServiceReferenceDVB&)m_reference; r.path = m_timeshift_file; - m_cue = new eCueSheet(); m_cue->seekTo(0, -1000); - m_service_handler_timeshift.tune(r, 1, m_cue, 0, m_dvb_service); /* use the decoder demux for everything */ + + ePtr source = createTsSource(r); + m_service_handler_timeshift.tuneExt(r, 1, source, m_timeshift_file.c_str(), m_cue, 0, m_dvb_service); /* use the decoder demux for everything */ eDebug("eDVBServicePlay::switchToTimeshift, in pause mode now."); pause(); @@ -2309,7 +2518,7 @@ void eDVBServicePlay::updateDecoder(bool sendSeekableStateChanged) eDebug("getting program info failed."); else { - eDebugNoNewLine("have %d video stream(s)", program.videoStreams.size()); + eDebugNoNewLine("have %zd video stream(s)", program.videoStreams.size()); if (!program.videoStreams.empty()) { eDebugNoNewLine(" ("); @@ -2328,7 +2537,7 @@ void eDVBServicePlay::updateDecoder(bool sendSeekableStateChanged) } eDebugNoNewLine(")"); } - eDebugNoNewLine(", and %d audio stream(s)", program.audioStreams.size()); + eDebugNoNewLine(", and %zd audio stream(s)", program.audioStreams.size()); if (!program.audioStreams.empty()) { eDebugNoNewLine(" ("); @@ -2351,8 +2560,6 @@ void eDVBServicePlay::updateDecoder(bool sendSeekableStateChanged) if (!m_decoder) { h.getDecodeDemux(m_decode_demux); - if (m_timeshift_changed) - m_decoder = 0; if (m_decode_demux) { m_decode_demux->getMPEGDecoder(m_decoder, m_is_primary); @@ -2428,9 +2635,11 @@ void eDVBServicePlay::updateDecoder(bool sendSeekableStateChanged) setPCMDelay(pcm_delay == -1 ? 0 : pcm_delay); m_decoder->setVideoPID(vpid, vpidtype); + m_current_video_pid_type = vpidtype; selectAudioStream(); - if (!(m_is_pvr || m_timeshift_active || !m_is_primary)) + //if (!(m_is_pvr || m_is_stream || m_timeshift_active || !m_is_primary)) + if (!(m_is_pvr || m_is_stream || m_timeshift_active)) m_decoder->setSyncPCR(pcrpid); else m_decoder->setSyncPCR(-1); @@ -2507,7 +2716,7 @@ void eDVBServicePlay::loadCuesheet() m_cue_entries.insert(cueEntry(where, what)); } fclose(f); - eDebug("%d entries", m_cue_entries.size()); + eDebug("%zd entries", m_cue_entries.size()); } else eDebug("cutfile not found!");