fixed buffer period calculation bug.
changed start_time to be TimeSource()->Now(). added some helpful comments. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@1079 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
6085f1efd6
commit
39a0622e4b
@ -108,7 +108,7 @@ void MediaReader::NodeRegistered(void)
|
|||||||
// now we can do this
|
// now we can do this
|
||||||
output.node = Node();
|
output.node = Node();
|
||||||
output.source.id = 0;
|
output.source.id = 0;
|
||||||
output.source.port = output.node.port;
|
output.source.port = output.node.port; // same as ControlPort();
|
||||||
|
|
||||||
// creates the parameter web and starts the looper thread
|
// creates the parameter web and starts the looper thread
|
||||||
AbstractFileInterfaceNode::NodeRegistered();
|
AbstractFileInterfaceNode::NodeRegistered();
|
||||||
@ -412,6 +412,9 @@ status_t MediaReader::SetBufferGroup(
|
|||||||
return B_NO_INIT;
|
return B_NO_INIT;
|
||||||
}
|
}
|
||||||
int32 count = int32(fDownstreamLatency/fBufferPeriod)+2;
|
int32 count = int32(fDownstreamLatency/fBufferPeriod)+2;
|
||||||
|
fprintf(stderr," downstream latency = %lld, buffer period = %lld, buffer count = %i\n",
|
||||||
|
fDownstreamLatency,fBufferPeriod,count);
|
||||||
|
|
||||||
// allocate the buffers
|
// allocate the buffers
|
||||||
fBufferGroup = new BBufferGroup(output.format.u.multistream.max_chunk_size,count);
|
fBufferGroup = new BBufferGroup(output.format.u.multistream.max_chunk_size,count);
|
||||||
if (fBufferGroup == 0) {
|
if (fBufferGroup == 0) {
|
||||||
@ -519,17 +522,21 @@ void MediaReader::Connect(
|
|||||||
output.destination = destination;
|
output.destination = destination;
|
||||||
output.format = format;
|
output.format = format;
|
||||||
strncpy(io_name,output.name,B_MEDIA_NAME_LENGTH-1);
|
strncpy(io_name,output.name,B_MEDIA_NAME_LENGTH-1);
|
||||||
io_name[B_MEDIA_NAME_LENGTH] = '\0';
|
io_name[B_MEDIA_NAME_LENGTH-1] = '\0';
|
||||||
|
|
||||||
// determine our downstream latency
|
// determine our downstream latency
|
||||||
media_node_id id;
|
media_node_id id;
|
||||||
FindLatencyFor(output.destination, &fDownstreamLatency, &id);
|
FindLatencyFor(output.destination, &fDownstreamLatency, &id);
|
||||||
|
|
||||||
// compute the buffer period (must be done before setbuffergroup)
|
// compute the buffer period (must be done before setbuffergroup)
|
||||||
fBufferPeriod = int32(8000000 / 1024
|
fBufferPeriod = bigtime_t(1000 * 8000000 / 1024
|
||||||
* output.format.u.multistream.max_chunk_size
|
* output.format.u.multistream.max_chunk_size
|
||||||
/ output.format.u.multistream.max_bit_rate);
|
/ output.format.u.multistream.max_bit_rate);
|
||||||
|
|
||||||
|
fprintf(stderr," max chunk size = %i, max bit rate = %f, buffer period = %i\n",
|
||||||
|
output.format.u.multistream.max_chunk_size,
|
||||||
|
output.format.u.multistream.max_bit_rate,fBufferPeriod);
|
||||||
|
|
||||||
// setup the buffers if they aren't setup yet
|
// setup the buffers if they aren't setup yet
|
||||||
if (fBufferGroup == 0) {
|
if (fBufferGroup == 0) {
|
||||||
status_t status = SetBufferGroup(output.source,0);
|
status_t status = SetBufferGroup(output.source,0);
|
||||||
@ -568,10 +575,10 @@ void MediaReader::Connect(
|
|||||||
|
|
||||||
fInternalLatency = end - start;
|
fInternalLatency = end - start;
|
||||||
|
|
||||||
fprintf(stderr,"internal latency from disk read = %i\n",fInternalLatency);
|
fprintf(stderr," internal latency from disk read = %i\n",fInternalLatency);
|
||||||
} else {
|
} else {
|
||||||
fInternalLatency = 100; // just guess
|
fInternalLatency = 100; // just guess
|
||||||
fprintf(stderr,"internal latency guessed = %i\n",fInternalLatency);
|
fprintf(stderr," internal latency guessed = %i\n",fInternalLatency);
|
||||||
}
|
}
|
||||||
|
|
||||||
SetEventLatency(fDownstreamLatency + fInternalLatency);
|
SetEventLatency(fDownstreamLatency + fInternalLatency);
|
||||||
@ -688,6 +695,8 @@ void MediaReader::LatencyChanged(
|
|||||||
fDownstreamLatency = new_latency;
|
fDownstreamLatency = new_latency;
|
||||||
SetEventLatency(fDownstreamLatency + fInternalLatency);
|
SetEventLatency(fDownstreamLatency + fInternalLatency);
|
||||||
}
|
}
|
||||||
|
// we may have to recompute the number of buffers that we are using
|
||||||
|
// see SetBufferGroup
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------- //
|
// -------------------------------------------------------- //
|
||||||
@ -808,12 +817,16 @@ status_t MediaReader::FillFileBuffer(
|
|||||||
fprintf(stderr,"<- B_NO_INIT\n");
|
fprintf(stderr,"<- B_NO_INIT\n");
|
||||||
return B_NO_INIT;
|
return B_NO_INIT;
|
||||||
}
|
}
|
||||||
|
fprintf(stderr," %i buffer bytes used, %i buffer bytes available\n",
|
||||||
|
buffer->SizeUsed(),buffer->SizeAvailable());
|
||||||
off_t position = GetCurrentFile()->Position();
|
off_t position = GetCurrentFile()->Position();
|
||||||
ssize_t bytesRead = GetCurrentFile()->Read(buffer->Data(),buffer->SizeAvailable());
|
ssize_t bytesRead = GetCurrentFile()->Read(buffer->Data(),buffer->SizeAvailable());
|
||||||
if (bytesRead < 0) {
|
if (bytesRead < 0) {
|
||||||
fprintf(stderr,"<- B_FILE_ERROR\n");
|
fprintf(stderr,"<- B_FILE_ERROR\n");
|
||||||
return B_FILE_ERROR; // some sort of file related error
|
return B_FILE_ERROR; // some sort of file related error
|
||||||
}
|
}
|
||||||
|
fprintf(stderr," %i file bytes read at position %i.\n",
|
||||||
|
bytesRead,position);
|
||||||
buffer->SetSizeUsed(bytesRead);
|
buffer->SetSizeUsed(bytesRead);
|
||||||
media_header * header = buffer->Header();
|
media_header * header = buffer->Header();
|
||||||
header->type = B_MEDIA_MULTISTREAM;
|
header->type = B_MEDIA_MULTISTREAM;
|
||||||
@ -821,9 +834,7 @@ status_t MediaReader::FillFileBuffer(
|
|||||||
header->file_pos = position;
|
header->file_pos = position;
|
||||||
header->orig_size = bytesRead;
|
header->orig_size = bytesRead;
|
||||||
header->time_source = TimeSource()->ID();
|
header->time_source = TimeSource()->ID();
|
||||||
// in our world performance time corresponds to bytes in the file
|
header->start_time = TimeSource()->Now();
|
||||||
// so the start time of this buffer of bytes is simply its position
|
|
||||||
header->start_time = position;
|
|
||||||
// nothing more to say?
|
// nothing more to say?
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user