| 318 | |
| 319 | |
| 320 | void |
| 321 | AudioProducer::Connect(status_t error, const media_source& source, |
| 322 | const media_destination& destination, |
| 323 | const media_format& format, char* io_name) |
| 324 | { |
| 325 | if (error) |
| 326 | { |
| 327 | mOutput.destination = media_destination::null; |
| 328 | mOutput.format = mPreferredFormat; |
| 329 | return; |
| 330 | } |
| 331 | mOutput.destination = destination; |
| 332 | mOutput.format = format; |
| 333 | strncpy(io_name, mOutput.name, B_MEDIA_NAME_LENGTH); |
| 334 | |
| 335 | media_node_id id; |
| 336 | FindLatencyFor(mOutput.destination, &mLatency, &id); |
| 337 | |
| 338 | size_t samplesPerBuffer |
| 339 | = mOutput.format.u.raw_audio.buffer_size / (sizeof(float)*mChans); |
| 340 | |
| 341 | SetEventLatency(mLatency + gAddLatency); // ignore internal time for now |
| 342 | |
| 343 | { |
| 344 | bigtime_t realtime, perftime; |
| 345 | float drift; |
| 346 | TimeSource()->GetTime(&perftime, &realtime, & drift); |
| 347 | } |
| 348 | bigtime_t duration |
| 349 | = bigtime_t(1000000) * samplesPerBuffer / |
| 350 | bigtime_t(mOutput.format.u.raw_audio.frame_rate); |
| 351 | SetBufferDuration(duration); |
| 352 | if (!mBufferGroup) AllocateBuffers(); |
| 353 | } |
| 354 | |
| 355 | |
| 356 | void |