status_t AudioProducer::_ChangeFormat(const media_format& format) { fOutput.format = format; // notify our audio supplier of the format change if (fSupplier) fSupplier->SetFormat(format); return _AllocateBuffers(format); }
/***************************************************************************** * VideoWindow constructor and destructor *****************************************************************************/ VideoWindow::VideoWindow(int v_width, int v_height, BRect frame, vout_thread_t *p_videoout) : BWindow(frame, NULL, B_TITLED_WINDOW, B_NOT_CLOSABLE | B_NOT_MINIMIZABLE), i_width(frame.IntegerWidth()), i_height(frame.IntegerHeight()), winSize(frame), i_buffer(0), teardownwindow(false), fTrueWidth(v_width), fTrueHeight(v_height), fCachedFeel(B_NORMAL_WINDOW_FEEL), fInterfaceShowing(false), fInitStatus(B_ERROR), fSettings(new VideoSettings(*VideoSettings::DefaultSettings())) { p_vout = p_videoout; // create the view to do the display view = new VLCView( Bounds(), p_vout ); // create background view BView *mainView = new BackgroundView( Bounds(), view ); AddChild(mainView); mainView->AddChild(view); // allocate bitmap buffers for (int32_t i = 0; i < 3; i++) bitmap[i] = NULL; fInitStatus = _AllocateBuffers(v_width, v_height, &mode); // make sure we layout the view correctly FrameResized(i_width, i_height); if (fInitStatus >= B_OK && mode == OVERLAY) { overlay_restrictions r; bitmap[0]->GetOverlayRestrictions(&r); SetSizeLimits((i_width * r.min_width_scale), i_width * r.max_width_scale, (i_height * r.min_height_scale), i_height * r.max_height_scale); } // vlc settings override settings from disk if (config_GetInt(p_vout, "fullscreen")) fSettings->AddFlags(VideoSettings::FLAG_FULL_SCREEN); _SetToSettings(); }
void AudioProducer::Connect(status_t error, const media_source& source, const media_destination& destination, const media_format& format, char* _name) { TRACE("AudioProducer::Connect(%s)\n", strerror(error)); // If something earlier failed, Connect() might still be called, but with // a non-zero error code. When that happens we simply unreserve the // connection and do nothing else. if (error != B_OK) { fOutput.destination = media_destination::null; fOutput.format = fPreferredFormat; return; } // Okay, the connection has been confirmed. Record the destination and // format that we agreed on, and report our connection name again. fOutput.destination = destination; fOutput.format = format; strncpy(_name, fOutput.name, B_MEDIA_NAME_LENGTH); // tell our audio supplier about the format if (fSupplier) { TRACE("AudioProducer::Connect() fSupplier->SetFormat()\n"); fSupplier->SetFormat(fOutput.format); } TRACE("AudioProducer::Connect() FindLatencyFor()\n"); // Now that we're connected, we can determine our downstream latency. // Do so, then make sure we get our events early enough. media_node_id id; FindLatencyFor(fOutput.destination, &fLatency, &id); // Use a dry run to see how long it takes me to fill a buffer of data size_t sampleSize = fOutput.format.u.raw_audio.format & media_raw_audio_format::B_AUDIO_SIZE_MASK; size_t samplesPerBuffer = fOutput.format.u.raw_audio.buffer_size / sampleSize; fInternalLatency = estimate_internal_latency(fOutput.format); if (!fLowLatency) fInternalLatency *= 32; SetEventLatency(fLatency + fInternalLatency); // reset our buffer duration, etc. to avoid later calculations bigtime_t duration = bigtime_t(1000000) * samplesPerBuffer / bigtime_t(fOutput.format.u.raw_audio.frame_rate * fOutput.format.u.raw_audio.channel_count); TRACE("AudioProducer::Connect() SetBufferDuration(%lld)\n", duration); SetBufferDuration(duration); TRACE("AudioProducer::Connect() _AllocateBuffers()\n"); // Set up the buffer group for our connection, as long as nobody handed // us a buffer group (via SetBufferGroup()) prior to this. That can // happen, for example, if the consumer calls SetOutputBuffersFor() on // us from within its Connected() method. if (fBufferGroup == NULL) _AllocateBuffers(fOutput.format); TRACE("AudioProducer::Connect() done\n"); }