* _FillNextBuffer(): performanceTime and startTime were duplicated variables.
* Small coding style improvements. * Improved generating of debug .wav file. * Incorporate the channel count in the audio buffer size! This was important since the duration could then lead to rounding errors. 6 channel playback is much improved, but still far from perfect. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38469 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -65,21 +65,22 @@ init_media_file(media_format format, BMediaTrack** _track)
|
|||||||
media_file_format fileFormat;
|
media_file_format fileFormat;
|
||||||
int32 cookie = 0;
|
int32 cookie = 0;
|
||||||
while (get_next_file_format(&cookie, &fileFormat) == B_OK) {
|
while (get_next_file_format(&cookie, &fileFormat) == B_OK) {
|
||||||
if (strcmp(fileFormat.short_name, "wav") == 0) {
|
if (strcmp(fileFormat.short_name, "wav") == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
file = new BMediaFile(&ref, &fileFormat);
|
file = new BMediaFile(&ref, &fileFormat);
|
||||||
|
|
||||||
media_codec_info info;
|
media_codec_info info;
|
||||||
cookie = 0;
|
cookie = 0;
|
||||||
while (get_next_encoder(&cookie, &info) == B_OK) {
|
while (get_next_encoder(&cookie, &info) == B_OK) {
|
||||||
if (strcmp(info.short_name, "raw-audio") == 0)
|
if (strcmp(info.short_name, "raw-audio") == 0
|
||||||
|
|| strcmp(info.short_name, "pcm") == 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
track = file->CreateTrack(&format, &info);
|
track = file->CreateTrack(&format, &info);
|
||||||
if (!track)
|
if (track == NULL)
|
||||||
printf("failed to create track\n");
|
printf("failed to create track\n");
|
||||||
|
|
||||||
file->CommitHeader();
|
file->CommitHeader();
|
||||||
@@ -755,6 +756,7 @@ AudioProducer::_SpecializeFormat(media_format* format)
|
|||||||
// 25, which it usually is.)
|
// 25, which it usually is.)
|
||||||
format->u.raw_audio.buffer_size
|
format->u.raw_audio.buffer_size
|
||||||
= uint32(format->u.raw_audio.frame_rate / 25.0)
|
= uint32(format->u.raw_audio.frame_rate / 25.0)
|
||||||
|
* format->u.raw_audio.channel_count
|
||||||
* (format->u.raw_audio.format
|
* (format->u.raw_audio.format
|
||||||
& media_raw_audio_format::B_AUDIO_SIZE_MASK);
|
& media_raw_audio_format::B_AUDIO_SIZE_MASK);
|
||||||
|
|
||||||
@@ -830,16 +832,14 @@ AudioProducer::_FillNextBuffer(bigtime_t eventTime)
|
|||||||
header->time_source = TimeSource()->ID();
|
header->time_source = TimeSource()->ID();
|
||||||
buffer->SetSizeUsed(fOutput.format.u.raw_audio.buffer_size);
|
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
|
// fill in data from audio supplier
|
||||||
int64 frameCount = numSamples / fOutput.format.u.raw_audio.channel_count;
|
int64 frameCount = numSamples / fOutput.format.u.raw_audio.channel_count;
|
||||||
bigtime_t startTime = performanceTime;
|
bigtime_t startTime = bigtime_t(double(fFramesSent)
|
||||||
|
* 1000000.0 / fOutput.format.u.raw_audio.frame_rate);
|
||||||
bigtime_t endTime = bigtime_t(double(fFramesSent + frameCount)
|
bigtime_t endTime = bigtime_t(double(fFramesSent + frameCount)
|
||||||
* 1000000.0 / fOutput.format.u.raw_audio.frame_rate);
|
* 1000000.0 / fOutput.format.u.raw_audio.frame_rate);
|
||||||
|
|
||||||
if (!fSupplier || fSupplier->InitCheck() != B_OK
|
if (fSupplier == NULL || fSupplier->InitCheck() != B_OK
|
||||||
|| fSupplier->GetFrames(buffer->Data(), frameCount, startTime,
|
|| fSupplier->GetFrames(buffer->Data(), frameCount, startTime,
|
||||||
endTime) != B_OK) {
|
endTime) != B_OK) {
|
||||||
ERROR("AudioProducer::_FillNextBuffer() - supplier error -> silence\n");
|
ERROR("AudioProducer::_FillNextBuffer() - supplier error -> silence\n");
|
||||||
@@ -847,17 +847,15 @@ AudioProducer::_FillNextBuffer(bigtime_t eventTime)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// stamp buffer
|
// stamp buffer
|
||||||
if (RunMode() == B_RECORDING) {
|
if (RunMode() == B_RECORDING)
|
||||||
header->start_time = eventTime;
|
header->start_time = eventTime;
|
||||||
} else {
|
else
|
||||||
header->start_time = fStartTime + performanceTime;
|
header->start_time = fStartTime + startTime;
|
||||||
}
|
|
||||||
|
|
||||||
#if DEBUG_TO_FILE
|
#if DEBUG_TO_FILE
|
||||||
BMediaTrack* track;
|
BMediaTrack* track;
|
||||||
if (BMediaFile* file = init_media_file(fOutput.format, &track)) {
|
if (init_media_file(fOutput.format, &track) != NULL)
|
||||||
track->WriteFrames(buffer->Data(), frameCount);
|
track->WriteFrames(buffer->Data(), frameCount);
|
||||||
}
|
|
||||||
#endif // DEBUG_TO_FILE
|
#endif // DEBUG_TO_FILE
|
||||||
|
|
||||||
if (fPeakListener
|
if (fPeakListener
|
||||||
@@ -887,7 +885,7 @@ AudioProducer::_FillNextBuffer(bigtime_t eventTime)
|
|||||||
message.AddFloat("max", maxAbs);
|
message.AddFloat("max", maxAbs);
|
||||||
}
|
}
|
||||||
bigtime_t realTime = TimeSource()->RealTimeFor(
|
bigtime_t realTime = TimeSource()->RealTimeFor(
|
||||||
fStartTime + performanceTime, 0);
|
fStartTime + startTime, 0);
|
||||||
MessageEvent* event = new (std::nothrow) MessageEvent(realTime,
|
MessageEvent* event = new (std::nothrow) MessageEvent(realTime,
|
||||||
fPeakListener, message);
|
fPeakListener, message);
|
||||||
if (event != NULL)
|
if (event != NULL)
|
||||||
|
|||||||
Reference in New Issue
Block a user