本文整理汇总了C++中BMediaTrack::SeekToFrame方法的典型用法代码示例。如果您正苦于以下问题:C++ BMediaTrack::SeekToFrame方法的具体用法?C++ BMediaTrack::SeekToFrame怎么用?C++ BMediaTrack::SeekToFrame使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类BMediaTrack
的用法示例。
在下文中一共展示了BMediaTrack::SeekToFrame方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: system_time
status_t
MainView::LoadWave(const entry_ref& ref)
{
bigtime_t startLoadWave = system_time();
fDestCursor = 0;
fSourceCursor = 0;
fAverage = 0.0f;
fAverageCursor = 0;
fDownsamplingWidth = 0;
fDownsampleCount = 0;
// instantiate a BMediaFile object, and make sure there was no error.
/*BEntry entry("./song.wav");
entry_ref ref;
entry.GetRef(&ref);*/
BMediaFile* mediaFile = new BMediaFile(&ref);
status_t err = mediaFile->InitCheck();
if (err != B_OK) {
printf("cannot contruct BMediaFile object -- %s\n", strerror(err));
return err;
}
for (int32 i = 0; i < mediaFile->CountTracks(); i++) {
BMediaTrack* track = mediaFile->TrackAt(i);
if (track == NULL) {
printf("cannot contruct BMediaTrack object\n");
return B_ERROR;
}
media_format format;
format.type = B_MEDIA_RAW_AUDIO;
format.u.raw_audio.format = media_raw_audio_format::B_AUDIO_FLOAT;
err = track->DecodedFormat(&format);
if (err != B_OK) {
printf("BMediaTrack::DecodedFormat error -- %s\n", strerror(err));
return err;
}
if (format.type == B_MEDIA_RAW_AUDIO) {
// get the actual sourceWindow.left obtained by seeking
bigtime_t start = system_time();
int64 actualSeekFrame = fSourceWindow.left;
err = track->SeekToFrame(&actualSeekFrame);
if (err != B_OK) {
printf("BMediaTrack::SeekToFrame(%lli) error -- %s\n", fSourceWindow.left, strerror(err));
return err;
}
printf("BMediaTrack::SeekToFrame(%lli) seekedto=%lli in %llims\n", fSourceWindow.left, actualSeekFrame, (system_time() - start) / 1000);
fSourceWindow.left = actualSeekFrame;
frame_range destWindow(0, (uint64) fWaveFrame.Width());
int64 totalSourceFrameCount = track->CountFrames();
fDownsamplingWidth = fSourceWindow.Width() / destWindow.Width();
printf("Source window left=%lli right=%lli width=%lli (total=%lli)\n", fSourceWindow.left, fSourceWindow.right, fSourceWindow.Width(), totalSourceFrameCount);
printf("Dest window left=%lli right=%lli width=%lli\n", destWindow.left, destWindow.right, destWindow.Width());
printf("Downsampling width=%lli\n", fDownsamplingWidth);
delete [] fWave;
fWave = NULL;
fWave = new(std::nothrow) float[fSourceWindow.Width() / fDownsamplingWidth]; // ATT: on en prend plus que la largeur de dest car downsampling width entier
if (fWave == NULL)
return B_NO_MEMORY;
char* buffer = new(std::nothrow) char[format.u.raw_audio.buffer_size];
if (buffer == NULL)
return B_NO_MEMORY;
int64 readFrameCount = 0;
media_header mediaHeader;
fSourceCursor = fSourceWindow.left;
for(int64 j = 0; j < fSourceWindow.Width(); j += readFrameCount) {
err = track->ReadFrames(buffer, &readFrameCount, &mediaHeader);
if (err) {
printf("BMediaTrack::ReadFrames error -- %s\n", strerror(err));
delete [] buffer;
break;
// TODO fatal error?
}
if (fSourceCursor + readFrameCount >= fSourceWindow.right) {
readFrameCount = fSourceWindow.right - fSourceCursor;
printf("yes readFrameCount = %lli\n", readFrameCount);
}
_ProcessAudio(buffer, &format, readFrameCount);
}
printf("Source cursor %li (read %li)\n", fSourceCursor, fSourceCursor - fSourceWindow.left);
printf("Dest cursor %li\n", fDestCursor);
delete [] buffer;
}
mediaFile->ReleaseTrack(track);
}
delete mediaFile;
//.........这里部分代码省略.........