Kumu::PathList_t& Kumu::FindInPath(const IPathMatch& Pattern, const std::string& SearchDir, Kumu::PathList_t& FoundPaths, bool one_shot, char separator) { char name_buf[MaxFilePath]; DirScanner Dir; if ( KM_SUCCESS(Dir.Open(SearchDir.c_str())) ) { while ( KM_SUCCESS(Dir.GetNext(name_buf)) ) { if ( name_buf[0] == '.' ) continue; // no hidden files std::string tmp_path = SearchDir + separator + name_buf; if ( PathIsDirectory(tmp_path.c_str()) ) FindInPath(Pattern, tmp_path, FoundPaths, one_shot, separator); else if ( Pattern.Match(name_buf) ) { FoundPaths.push_back(SearchDir + separator + name_buf); if ( one_shot ) break; } } } return FoundPaths; }
Result_t h__DeletePath(const std::string& pathname) { if ( pathname.empty() ) return RESULT_NULL_STR; Result_t result = RESULT_OK; if ( ! PathIsDirectory(pathname) ) { result = DeleteFile(pathname); } else { { DirScanner TestDir; char next_file[Kumu::MaxFilePath]; result = TestDir.Open(pathname.c_str()); while ( KM_SUCCESS(result) && KM_SUCCESS(TestDir.GetNext(next_file)) ) { if ( next_file[0] == '.' ) { if ( next_file[1] == 0 ) continue; // don't delete 'this' if ( next_file[1] == '.' && next_file[2] == 0 ) continue; // don't delete 'this' parent } result = h__DeletePath(pathname + std::string("/") + next_file); } } if ( _rmdir(pathname.c_str()) != 0 ) { switch ( errno ) { case ENOENT: case ENOTDIR: result = RESULT_NOTAFILE; break; case EROFS: case EBUSY: case EACCES: case EPERM: result = RESULT_NO_PERM; break; default: DefaultLogSink().Error("DeletePath %s: %s\n", pathname.c_str(), strerror(errno)); result = RESULT_FAIL; } } } return result; }
Result_t ASDCP::AtmosSyncChannelMixer::OpenRead(const Kumu::PathList_t& argv, const Rational& PictureRate) { Result_t result = RESULT_OK; PathList_t::iterator fi; Kumu::PathList_t file_list; PCM::AudioDescriptor tmpDesc; if ( argv.size() == 1 && PathIsDirectory(argv.front()) ) { DirScanner Dir; char name_buf[MaxFilePath]; result = Dir.Open(argv.front().c_str()); if ( KM_SUCCESS(result) ) result = Dir.GetNext(name_buf); while ( KM_SUCCESS(result) ) { if ( name_buf[0] != '.' ) // no hidden files { std::string tmp_path = argv.front() + "/" + name_buf; file_list.push_back(tmp_path); } result = Dir.GetNext(name_buf); } if ( result == RESULT_ENDOFFILE ) { result = RESULT_OK; file_list.sort(); } } else { file_list = argv; } for ( fi = file_list.begin(); KM_SUCCESS(result) && fi != file_list.end(); ++fi ) { result = OpenRead(*fi, PictureRate); } if ( ASDCP_SUCCESS(result) && (m_ChannelCount < ATMOS::SYNC_CHANNEL)) { // atmos sync channel has not been added result = MixInSilenceChannels(); if ( ASDCP_SUCCESS(result) ) result = MixInAtmosSyncChannel(); } if ( ASDCP_SUCCESS(result) ) { m_ADesc.ChannelCount = m_ChannelCount; m_ADesc.AvgBps = (ui32_t)(ceil(m_ADesc.AudioSamplingRate.Quotient()) * m_ADesc.BlockAlign); } else { clear(); } return result; }
Result_t ASDCP::PCMParserList::OpenRead(const Kumu::PathList_t& argv, const Rational& PictureRate) { Result_t result = RESULT_OK; PathList_t::iterator fi; Kumu::PathList_t file_list; if ( argv.size() == 1 && PathIsDirectory(argv.front()) ) { DirScanner Dir; char name_buf[MaxFilePath]; result = Dir.Open(argv.front().c_str()); if ( KM_SUCCESS(result) ) result = Dir.GetNext(name_buf); while ( KM_SUCCESS(result) ) { if ( name_buf[0] != '.' ) // no hidden files { std::string tmp_path = argv.front() + "/" + name_buf; file_list.push_back(tmp_path); } result = Dir.GetNext(name_buf); } if ( result == RESULT_ENDOFFILE ) { result = RESULT_OK; file_list.sort(); } } else { file_list = argv; } for ( fi = file_list.begin(); KM_SUCCESS(result) && fi != file_list.end(); ++fi ) { mem_ptr<ParserInstance> I = new ParserInstance; result = I->OpenRead(fi->c_str(), PictureRate); if ( ASDCP_SUCCESS(result) ) { if ( fi == file_list.begin() ) { m_ADesc = I->ADesc; } else { if ( I->ADesc.AudioSamplingRate != m_ADesc.AudioSamplingRate ) { DefaultLogSink().Error("AudioSamplingRate mismatch in PCM parser list."); return RESULT_FORMAT; } if ( I->ADesc.QuantizationBits != m_ADesc.QuantizationBits ) { DefaultLogSink().Error("QuantizationBits mismatch in PCM parser list."); return RESULT_FORMAT; } if ( I->ADesc.ContainerDuration < m_ADesc.ContainerDuration ) m_ADesc.ContainerDuration = I->ADesc.ContainerDuration; m_ADesc.BlockAlign += I->ADesc.BlockAlign; } m_ChannelCount += I->ADesc.ChannelCount; } if ( ASDCP_SUCCESS(result) ) result = I->FB.Capacity(PCM::CalcFrameBufferSize(m_ADesc)); if ( ASDCP_SUCCESS(result) ) { push_back(I); I.release(); } } if ( ASDCP_SUCCESS(result) ) { m_ADesc.ChannelCount = m_ChannelCount; m_ADesc.AvgBps = (ui32_t)(ceil(m_ADesc.AudioSamplingRate.Quotient()) * m_ADesc.BlockAlign); } else { clear(); } return result; }