bool FLACImportFileHandle::Init() { #ifdef LEGACY_FLAC bool success = mFile->set_filename(OSINPUT(mFilename)); if (!success) { return false; } mFile->set_metadata_respond(FLAC__METADATA_TYPE_STREAMINFO); mFile->set_metadata_respond(FLAC__METADATA_TYPE_VORBIS_COMMENT); FLAC::Decoder::File::State state = mFile->init(); if (state != FLAC__FILE_DECODER_OK) { return false; } #else if (!mHandle.Open(mFilename, wxT("rb"))) { return false; } // Even though there is an init() method that takes a filename, use the one that // takes a file handle because wxWidgets can open a file with a Unicode name and // libflac can't (under Windows). // // Responsibility for closing the file is passed to libflac. // (it happens when mFile->finish() is called) bool result = mFile->init(mHandle.fp())?true:false; mHandle.Detach(); if (result != FLAC__STREAM_DECODER_INIT_STATUS_OK) { return false; } #endif mFile->process_until_end_of_metadata(); #ifdef LEGACY_FLAC state = mFile->get_state(); if (state != FLAC__FILE_DECODER_OK) { return false; } #else // not necessary to check state, error callback will catch errors, but here's how: if (mFile->get_state() > FLAC__STREAM_DECODER_READ_FRAME) { return false; } #endif if (!mFile->is_valid() || mFile->get_was_error()) { // This probably is not a FLAC file at all return false; } return true; }
bool FLACImportFileHandle::Init() { #ifdef LEGACY_FLAC bool success = mFile->set_filename(OSFILENAME(mFilename)); if (!success) { return false; } mFile->set_metadata_respond(FLAC__METADATA_TYPE_STREAMINFO); mFile->set_metadata_respond(FLAC__METADATA_TYPE_VORBIS_COMMENT); FLAC::Decoder::File::State state = mFile->init(); if (state != FLAC__FILE_DECODER_OK) { return false; } #else if (mFile->init(OSFILENAME(mFilename)) != FLAC__STREAM_DECODER_INIT_STATUS_OK) { return false; } #endif mFile->process_until_end_of_metadata(); #ifdef LEGACY_FLAC state = mFile->get_state(); if (state != FLAC__FILE_DECODER_OK) { return false; } #else // not necessary to check state, error callback will catch errors, but here's how: if (mFile->get_state() > FLAC__STREAM_DECODER_READ_FRAME) { return false; } #endif if (!mFile->is_valid() || mFile->get_was_error()) { // This probably is not a FLAC file at all return false; } return true; }
int FLACImportFileHandle::Import(TrackFactory *trackFactory, Track ***outTracks, int *outNumTracks, Tags *tags) { wxASSERT(mStreamInfoDone); CreateProgress(); mChannels = new WaveTrack *[mNumChannels]; unsigned long c; for (c = 0; c < mNumChannels; c++) { mChannels[c] = trackFactory->NewWaveTrack(mFormat, mSampleRate); if (mNumChannels == 2) { switch (c) { case 0: mChannels[c]->SetChannel(Track::LeftChannel); mChannels[c]->SetLinked(true); break; case 1: mChannels[c]->SetChannel(Track::RightChannel); break; } } else { mChannels[c]->SetChannel(Track::MonoChannel); } } //Start OD bool useOD = false; #ifdef EXPERIMENTAL_OD_FLAC useOD=true; #endif // TODO: Vigilant Sentry: Variable res unused after assignment (error code DA1) // Should check the result. #ifdef LEGACY_FLAC bool res = (mFile->process_until_end_of_file() != 0); #else bool res = true; if(!useOD) res = (mFile->process_until_end_of_stream() != 0); #endif //add the task to the ODManager if(useOD) { sampleCount fileTotalFrames = mNumSamples; sampleCount maxBlockSize = mChannels[0]->GetMaxBlockSize(); for (sampleCount i = 0; i < fileTotalFrames; i += maxBlockSize) { sampleCount blockLen = maxBlockSize; if (i + blockLen > fileTotalFrames) blockLen = fileTotalFrames - i; for (c = 0; c < mNumChannels; c++) mChannels[c]->AppendCoded(mFilename, i, blockLen, c,ODTask::eODFLAC); mUpdateResult = mProgress->Update(i, fileTotalFrames); if (mUpdateResult != eProgressSuccess) break; } bool moreThanStereo = mNumChannels>2; for (c = 0; c < mNumChannels; c++) { mDecoderTask->AddWaveTrack(mChannels[c]); if(moreThanStereo) { //if we have 3 more channels, they get imported on seperate tracks, so we add individual tasks for each. ODManager::Instance()->AddNewTask(mDecoderTask); mDecoderTask=new ODDecodeFlacTask; //TODO: see if we need to use clone to keep the metadata. } } //if we have mono or a linked track (stereo), we add ONE task for the one linked wave track if(!moreThanStereo) ODManager::Instance()->AddNewTask(mDecoderTask); } //END OD if (mUpdateResult == eProgressFailed || mUpdateResult == eProgressCancelled) { for(c = 0; c < mNumChannels; c++) { delete mChannels[c]; } delete[] mChannels; return mUpdateResult; } *outNumTracks = mNumChannels; *outTracks = new Track *[mNumChannels]; for (c = 0; c < mNumChannels; c++) { mChannels[c]->Flush(); (*outTracks)[c] = mChannels[c]; } delete[] mChannels; tags->Clear(); size_t cnt = mFile->mComments.GetCount(); for (c = 0; c < cnt; c++) { wxString name = mFile->mComments[c].BeforeFirst(wxT('=')); wxString value = mFile->mComments[c].AfterFirst(wxT('=')); if (name.Upper() == wxT("DATE") && !tags->HasTag(TAG_YEAR)) { long val; if (value.Length() == 4 && value.ToLong(&val)) { name = TAG_YEAR; } } tags->SetTag(name, value); } return mUpdateResult; }
bool FLACImportFileHandle::Init() { #ifdef EXPERIMENTAL_OD_FLAC mDecoderTask=new ODDecodeFlacTask; ODFlacDecoder* odDecoder = (ODFlacDecoder*)mDecoderTask->CreateFileDecoder(mFilename); if(!odDecoder || !odDecoder->ReadHeader()) { //DELETE the task only if it failed to read - otherwise the OD man takes care of it. delete mDecoderTask; return false; } //copy the meta data over to the class mSampleRate=odDecoder->mSampleRate; mNumChannels=odDecoder->mNumChannels; mBitsPerSample=odDecoder->mBitsPerSample; mNumSamples=odDecoder->mNumSamples; mBitsPerSample=odDecoder->mBitsPerSample; mFormat=odDecoder->mFormat; mStreamInfoDone=true; return true; #endif #ifdef LEGACY_FLAC bool success = mFile->set_filename(OSINPUT(mFilename)); if (!success) { return false; } mFile->set_metadata_respond(FLAC__METADATA_TYPE_STREAMINFO); mFile->set_metadata_respond(FLAC__METADATA_TYPE_VORBIS_COMMENT); FLAC::Decoder::File::State state = mFile->init(); if (state != FLAC__FILE_DECODER_OK) { return false; } #else if (!mHandle.Open(mFilename, wxT("rb"))) { return false; } // Even though there is an init() method that takes a filename, use the one that // takes a file handle because wxWidgets can open a file with a Unicode name and // libflac can't (under Windows). // // Responsibility for closing the file is passed to libflac. // (it happens when mFile->finish() is called) bool result = mFile->init(mHandle.fp())?true:false; mHandle.Detach(); if (result != FLAC__STREAM_DECODER_INIT_STATUS_OK) { return false; } #endif mFile->process_until_end_of_metadata(); #ifdef LEGACY_FLAC state = mFile->get_state(); if (state != FLAC__FILE_DECODER_OK) { return false; } #else // not necessary to check state, error callback will catch errors, but here's how: if (mFile->get_state() > FLAC__STREAM_DECODER_READ_FRAME) { return false; } #endif if (!mFile->is_valid() || mFile->get_was_error()) { // This probably is not a FLAC file at all return false; } return true; }
int FLACImportFileHandle::Import(TrackFactory *trackFactory, Track ***outTracks, int *outNumTracks, Tags *tags) { wxASSERT(mStreamInfoDone); CreateProgress(); mChannels = new WaveTrack *[mNumChannels]; unsigned long c; for (c = 0; c < mNumChannels; c++) { mChannels[c] = trackFactory->NewWaveTrack(mFormat, mSampleRate); if (mNumChannels == 2) { switch (c) { case 0: mChannels[c]->SetChannel(Track::LeftChannel); mChannels[c]->SetLinked(true); break; case 1: mChannels[c]->SetChannel(Track::RightChannel); mChannels[c]->SetTeamed(true); break; } } else { mChannels[c]->SetChannel(Track::MonoChannel); } } #ifdef LEGACY_FLAC bool res = (mFile->process_until_end_of_file() != 0); #else bool res = (mFile->process_until_end_of_stream() != 0); #endif if (!res) { for(c = 0; c < mNumChannels; c++) { delete mChannels[c]; } delete[] mChannels; return (mCancelled ? eImportCancelled : eImportFailed); } *outNumTracks = mNumChannels; *outTracks = new Track *[mNumChannels]; for (c = 0; c < mNumChannels; c++) { mChannels[c]->Flush(); (*outTracks)[c] = mChannels[c]; } delete[] mChannels; tags->Clear(); size_t cnt = mFile->mComments.GetCount(); for (c = 0; c < cnt; c++) { tags->SetTag(mFile->mComments[c].BeforeFirst(wxT('=')), mFile->mComments[c].AfterFirst(wxT('='))); } return eImportSuccess; }
int FLACImportFileHandle::Import(TrackFactory *trackFactory, Track ***outTracks, int *outNumTracks, Tags *tags) { wxASSERT(mStreamInfoDone); CreateProgress(); mChannels = new WaveTrack *[mNumChannels]; unsigned long c; for (c = 0; c < mNumChannels; c++) { mChannels[c] = trackFactory->NewWaveTrack(mFormat, mSampleRate); if (mNumChannels == 2) { switch (c) { case 0: mChannels[c]->SetChannel(Track::LeftChannel); mChannels[c]->SetLinked(true); break; case 1: mChannels[c]->SetChannel(Track::RightChannel); break; } } else { mChannels[c]->SetChannel(Track::MonoChannel); } } #ifdef LEGACY_FLAC bool res = (mFile->process_until_end_of_file() != 0); #else bool res = (mFile->process_until_end_of_stream() != 0); #endif if (mUpdateResult == eProgressFailed || mUpdateResult == eProgressCancelled) { for(c = 0; c < mNumChannels; c++) { delete mChannels[c]; } delete[] mChannels; return mUpdateResult; } *outNumTracks = mNumChannels; *outTracks = new Track *[mNumChannels]; for (c = 0; c < mNumChannels; c++) { mChannels[c]->Flush(); (*outTracks)[c] = mChannels[c]; } delete[] mChannels; tags->Clear(); size_t cnt = mFile->mComments.GetCount(); for (c = 0; c < cnt; c++) { wxString name = mFile->mComments[c].BeforeFirst(wxT('=')); wxString value = mFile->mComments[c].AfterFirst(wxT('=')); if (name.Upper() == wxT("DATE") && !tags->HasTag(TAG_YEAR)) { long val; if (value.Length() == 4 && value.ToLong(&val)) { name = TAG_YEAR; } } tags->SetTag(name, value); } return mUpdateResult; }