workaround for crashing bug in RealPlayer. specialize the frame_rate when Connected gets called with a frame rate of 0.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7690 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
7ce4cf0866
commit
9c5b691f22
@ -152,6 +152,8 @@ AudioMixer::HandleMessage(int32 message, const void *data, size_t size)
|
|||||||
status_t
|
status_t
|
||||||
AudioMixer::AcceptFormat(const media_destination &dest, media_format *ioFormat)
|
AudioMixer::AcceptFormat(const media_destination &dest, media_format *ioFormat)
|
||||||
{
|
{
|
||||||
|
PRINT_FORMAT("AudioMixer::AcceptFormat: ", *ioFormat);
|
||||||
|
|
||||||
// check that the specified format is reasonable for the specified destination, and
|
// check that the specified format is reasonable for the specified destination, and
|
||||||
// fill in any wildcard fields for which our BBufferConsumer has specific requirements.
|
// fill in any wildcard fields for which our BBufferConsumer has specific requirements.
|
||||||
|
|
||||||
@ -189,6 +191,8 @@ AudioMixer::AcceptFormat(const media_destination &dest, media_format *ioFormat)
|
|||||||
status_t
|
status_t
|
||||||
AudioMixer::GetNextInput(int32 *cookie, media_input *out_input)
|
AudioMixer::GetNextInput(int32 *cookie, media_input *out_input)
|
||||||
{
|
{
|
||||||
|
TRACE("AudioMixer::GetNextInput\n");
|
||||||
|
|
||||||
// our 0th input is always a wildcard and free one
|
// our 0th input is always a wildcard and free one
|
||||||
if (*cookie == 0) {
|
if (*cookie == 0) {
|
||||||
out_input->node = Node();
|
out_input->node = Node();
|
||||||
@ -323,6 +327,17 @@ status_t
|
|||||||
AudioMixer::Connected(const media_source &producer, const media_destination &where,
|
AudioMixer::Connected(const media_source &producer, const media_destination &where,
|
||||||
const media_format &with_format, media_input *out_input)
|
const media_format &with_format, media_input *out_input)
|
||||||
{
|
{
|
||||||
|
PRINT_FORMAT("AudioMixer::Connected: ", with_format);
|
||||||
|
|
||||||
|
// workaround for a crashing bug in RealPlayer. to be proper, RealPlayer's
|
||||||
|
// BBufferProducer::PrepareToConnect() should have removed all wildcards.
|
||||||
|
if (out_input->format.u.raw_audio.frame_rate == 0) {
|
||||||
|
fprintf(stderr, "WARNING: Producer (port %ld, id %ld) connected with frame_rate=0\n", producer.port, producer.id);
|
||||||
|
MixerOutput *output = fCore->Output();
|
||||||
|
float frame_rate = output ? output->MediaOutput().format.u.raw_audio.frame_rate : 44100.0f;
|
||||||
|
out_input->format.u.raw_audio.frame_rate = frame_rate;
|
||||||
|
}
|
||||||
|
|
||||||
// a BBufferProducer is connection to our BBufferConsumer
|
// a BBufferProducer is connection to our BBufferConsumer
|
||||||
|
|
||||||
// incoming connections should always have an incoming ID=0,
|
// incoming connections should always have an incoming ID=0,
|
||||||
@ -414,6 +429,8 @@ AudioMixer::FormatChanged(const media_source &producer, const media_destination
|
|||||||
status_t
|
status_t
|
||||||
AudioMixer::FormatSuggestionRequested(media_type type, int32 quality, media_format *format)
|
AudioMixer::FormatSuggestionRequested(media_type type, int32 quality, media_format *format)
|
||||||
{
|
{
|
||||||
|
TRACE("AudioMixer::FormatSuggestionRequested\n");
|
||||||
|
|
||||||
// BBufferProducer function, a downstream consumer
|
// BBufferProducer function, a downstream consumer
|
||||||
// is asking for our output format
|
// is asking for our output format
|
||||||
|
|
||||||
@ -540,6 +557,8 @@ err:
|
|||||||
status_t
|
status_t
|
||||||
AudioMixer::GetNextOutput(int32 *cookie, media_output *out_output)
|
AudioMixer::GetNextOutput(int32 *cookie, media_output *out_output)
|
||||||
{
|
{
|
||||||
|
TRACE("AudioMixer::GetNextOutput\n");
|
||||||
|
|
||||||
if (*cookie != 0)
|
if (*cookie != 0)
|
||||||
return B_BAD_INDEX;
|
return B_BAD_INDEX;
|
||||||
|
|
||||||
@ -639,6 +658,8 @@ status_t
|
|||||||
AudioMixer::PrepareToConnect(const media_source &what, const media_destination &where,
|
AudioMixer::PrepareToConnect(const media_source &what, const media_destination &where,
|
||||||
media_format *format, media_source *out_source, char *out_name)
|
media_format *format, media_source *out_source, char *out_name)
|
||||||
{
|
{
|
||||||
|
TRACE("AudioMixer::PrepareToConnect\n");
|
||||||
|
|
||||||
// PrepareToConnect() is the second stage of format negotiations that happens
|
// PrepareToConnect() is the second stage of format negotiations that happens
|
||||||
// inside BMediaRoster::Connect(). At this point, the consumer's AcceptFormat()
|
// inside BMediaRoster::Connect(). At this point, the consumer's AcceptFormat()
|
||||||
// method has been called, and that node has potentially changed the proposed
|
// method has been called, and that node has potentially changed the proposed
|
||||||
|
Loading…
Reference in New Issue
Block a user