本文整理汇总了C++中BMediaTrack::WriteFrames方法的典型用法代码示例。如果您正苦于以下问题:C++ BMediaTrack::WriteFrames方法的具体用法?C++ BMediaTrack::WriteFrames怎么用?C++ BMediaTrack::WriteFrames使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类BMediaTrack
的用法示例。
在下文中一共展示了BMediaTrack::WriteFrames方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: RefsReceived
//.........这里部分代码省略.........
#ifndef __VM_SYSTEM //RAM
float *mem = Pool.sample_memory + save_start*Pool.sample_type; // src memory
#else
float *convert_buffer = (float*)malloc(buffer_step*channels*4); // make sure there can be floats in it
// read audio from source and write to destination, if necessary
if (convert_buffer) {
VM.ReadBlockAt(save_start, convert_buffer, buffer_step*channels );
float *mem = convert_buffer;
#endif
Pool.StartProgress(Language.get("SAVING_FILE"), save_end-save_start);
for (int64 i=save_start; i<save_end; i+=buffer_step){
// fill up the buffer
int32 block = MIN( (save_end-i) , buffer_step);
switch(format.u.raw_audio.format){
case 0x24: // 0 == mid, -1.0 == bottom, 1.0 == top (the preferred format for non-game audio)
{ float *tmp = (float*)buffer;
for (int32 count = 0; count<block*channels; count++){
*tmp++ = *mem++;
}
} break;
case 0x4: // 0 == mid, 0x80000001 == bottom, 0x7fffffff == top (all >16-bit formats, left-adjusted)
{ int32 *tmp = (int32*)buffer;
for (int32 count = 0; count<block*channels; count++){
t = *mem++;
*tmp++ = ROUND(t*0x7fffffff);
}
} break;
case 0x2: // 0 == mid, -32767 == bottom, +32767 == top
{ int16 *tmp = (int16*)buffer;
for (int32 count = 0; count<block*channels; count++){
t = *mem++;
*tmp++ = ROUND(t*32767.0);
}
} break;
case 0x11: // 128 == mid, 1 == bottom, 255 == top (discouraged but supported format)
{ uint8 *tmp = (uint8*)buffer;
for (int32 count = 0; count<block*channels; count++){
t = *mem++;
*tmp = ROUND(t*127.0);
tmp++;
*tmp = *tmp ^ 0x80;
}
} break;
case 0x1: // 0 == mid, -127 == bottom, +127 == top (not officially supported format)
{ int8 *tmp = (int8*)buffer;
for (int32 count = 0; count<block*channels; count++){
t = *mem++;
*tmp++ = ROUND(t*127.0); // xor 128 to invert sign bit
}
} break;
}
Pool.ProgressUpdate( block );
outTrack->WriteFrames(buffer, block);
#ifdef __VM_SYSTEM //RAM
VM.ReadBlock(convert_buffer, block*channels );
mem = convert_buffer;
#endif
}
#ifdef __VM_SYSTEM //RAM
free(convert_buffer);
}
#endif
Pool.changed = false;
outTrack->Flush();
BMimeType result;
BEntry ent(&dir,name);
entry_ref fref;
ent.GetRef(&fref);
BMimeType::GuessMimeType(&fref,&result);
BNodeInfo ninfo(&newFile);
ninfo.SetType(result.Type());
}else{
(new BAlert(NULL, Language.get("CODEC_FORMAT_ERROR"), Language.get("OK")))->Go();
}
file.CloseFile();
free(buffer);
Pool.HideProgress();
}
}else{
(new BAlert(NULL, Language.get("SAVE_ERROR"), Language.get("OK")))->Go();
}
if (Pool.save_mode == 2)
PostMessage(B_QUIT_REQUESTED);
if (Pool.save_mode == 1)
mainWindow->PostMessage(OPEN);
Pool.save_mode = 0;
}
示例2: message
BBuffer*
AudioProducer::_FillNextBuffer(bigtime_t eventTime)
{
BBuffer* buffer = fBufferGroup->RequestBuffer(
fOutput.format.u.raw_audio.buffer_size, BufferDuration());
if (!buffer) {
ERROR("AudioProducer::_FillNextBuffer() - no buffer\n");
return NULL;
}
size_t sampleSize = fOutput.format.u.raw_audio.format
& media_raw_audio_format::B_AUDIO_SIZE_MASK;
size_t numSamples = fOutput.format.u.raw_audio.buffer_size / sampleSize;
// number of sample in the buffer
// fill in the buffer header
media_header* header = buffer->Header();
header->type = B_MEDIA_RAW_AUDIO;
header->time_source = TimeSource()->ID();
buffer->SetSizeUsed(fOutput.format.u.raw_audio.buffer_size);
bigtime_t performanceTime = bigtime_t(double(fFramesSent)
* 1000000.0 / double(fOutput.format.u.raw_audio.frame_rate));
// fill in data from audio supplier
int64 frameCount = numSamples / fOutput.format.u.raw_audio.channel_count;
bigtime_t startTime = performanceTime;
bigtime_t endTime = bigtime_t(double(fFramesSent + frameCount)
* 1000000.0 / fOutput.format.u.raw_audio.frame_rate);
if (!fSupplier || fSupplier->InitCheck() != B_OK
|| fSupplier->GetFrames(buffer->Data(), frameCount, startTime,
endTime) != B_OK) {
ERROR("AudioProducer::_FillNextBuffer() - supplier error -> silence\n");
memset(buffer->Data(), 0, buffer->SizeUsed());
}
// stamp buffer
if (RunMode() == B_RECORDING) {
header->start_time = eventTime;
} else {
header->start_time = fStartTime + performanceTime;
}
#if DEBUG_TO_FILE
BMediaTrack* track;
if (BMediaFile* file = init_media_file(fOutput.format, &track)) {
track->WriteFrames(buffer->Data(), frameCount);
}
#endif // DEBUG_TO_FILE
if (fPeakListener
&& fOutput.format.u.raw_audio.format
== media_raw_audio_format::B_AUDIO_FLOAT) {
// TODO: extend the peak notifier for other sample formats
int32 channels = fOutput.format.u.raw_audio.channel_count;
float max[channels];
float min[channels];
for (int32 i = 0; i < channels; i++) {
max[i] = -1.0;
min[i] = 1.0;
}
float* sample = (float*)buffer->Data();
for (uint32 i = 0; i < frameCount; i++) {
for (int32 k = 0; k < channels; k++) {
if (*sample < min[k])
min[k] = *sample;
if (*sample > max[k])
max[k] = *sample;
sample++;
}
}
BMessage message(MSG_PEAK_NOTIFICATION);
for (int32 i = 0; i < channels; i++) {
float maxAbs = max_c(fabs(min[i]), fabs(max[i]));
message.AddFloat("max", maxAbs);
}
bigtime_t realTime = TimeSource()->RealTimeFor(
fStartTime + performanceTime, 0);
MessageEvent* event = new (std::nothrow) MessageEvent(realTime,
fPeakListener, message);
if (event != NULL)
EventQueue::Default().AddEvent(event);
}
return buffer;
}
示例3: sizeof
//.........这里部分代码省略.........
// read video from source and write to destination, if necessary
if (outVidTrack != NULL) {
lastPercent = -1;
videoFrameCount = inVidTrack->CountFrames();
if (endDuration == 0 || endDuration < startDuration) {
start = 0;
end = videoFrameCount;
} else {
inVidTrack->SeekToTime(&endDuration, stat);
end = inVidTrack->CurrentFrame();
inVidTrack->SeekToTime(&startDuration, stat);
start = inVidTrack->CurrentFrame();
if (end > videoFrameCount)
end = videoFrameCount;
if (start > end)
start = 0;
}
framesRead = 0;
for (int64 i = start; (i <= end) && !fCancel; i += framesRead) {
if ((ret = inVidTrack->ReadFrames(videoBuffer, &framesRead,
&mh)) != B_OK) {
fprintf(stderr, "Error reading video frame %" B_PRId64 ": %s\n", i,
strerror(ret));
snprintf(status.LockBuffer(128), 128,
B_TRANSLATE("Error read video frame %" B_PRId64), i);
status.UnlockBuffer();
SetStatusMessage(status.String());
break;
}
if ((ret = outVidTrack->WriteFrames(videoBuffer, framesRead,
mh.u.encoded_video.field_flags)) != B_OK) {
fprintf(stderr, "Error writing video frame %" B_PRId64 ": %s\n", i,
strerror(ret));
snprintf(status.LockBuffer(128), 128,
B_TRANSLATE("Error writing video frame %" B_PRId64), i);
status.UnlockBuffer();
SetStatusMessage(status.String());
break;
}
completePercent = (float)(i - start) / (float)(end - start) * 100;
currPercent = (int32)completePercent;
if (currPercent > lastPercent) {
lastPercent = currPercent;
snprintf(status.LockBuffer(128), 128,
B_TRANSLATE("Writing video track: %" B_PRId32 "%% complete"),
currPercent);
status.UnlockBuffer();
SetStatusMessage(status.String());
}
}
outVidTrack->Flush();
inFile->ReleaseTrack(inVidTrack);
}
// read audio from source and write to destination, if necessary
if (outAudTrack != NULL) {
lastPercent = -1;
audioFrameCount = inAudTrack->CountFrames();