void ClientNode::_DataAvailable(bigtime_t time) { size_t samples = fFormat.u.raw_audio.buffer_size / sizeof(float); fFramesSent += samples; JackPortList* ports = fOwner->GetOutputPorts(); for (int i = 0; i < ports->CountItems(); i++) { JackPort* port = ports->ItemAt(i); if (port != NULL && port->IsConnected()) { BBuffer* buffer = FillNextBuffer(time, port); if (buffer) { if (SendBuffer(buffer, port->MediaOutput()->source, port->MediaOutput()->destination) != B_OK) { printf("ClientNode::_DataAvailable: Buffer sending " "failed\n"); buffer->Recycle(); } size_t nFrames = fFormat.u.raw_audio.buffer_size / ((fFormat.u.raw_audio.format & media_raw_audio_format::B_AUDIO_SIZE_MASK) * fFormat.u.raw_audio.channel_count); } if (buffer == NULL) return; } } }
void ClientNode::Connect(status_t status, const media_source &src, const media_destination &dst, const media_format &format, char* name) { if (status != B_OK) return; media_node_id id; FindLatencyFor(dst, &fDownstreamLatency, &id); fOwner->SetFormat(format); JackPort* port; JackPortList* outputs = fOwner->GetOutputPorts(); for (int i = 0; i < outputs->CountItems(); i++) { port = outputs->ItemAt(i); BString str(jack_port_name((jack_port_t*) port)); if (str.Compare(name) == 0 && !port->IsConnected()) { printf("ClientNode::Connect %s\n", port->Name()); port->MediaOutput()->source = src; port->MediaOutput()->destination = dst; port->MediaOutput()->format = format; break; } } }
bool JackClient::PortsReady() const { if(!fOpen && !fActivated) return false; JackPortList* lst = GetOutputPorts(); for (int i = 0; i < lst->CountItems(); i++) { JackPort* port = lst->ItemAt(i); if (!port->IsConnected()) return false; } lst = GetInputPorts(); for (int i = 0; i < lst->CountItems(); i++) { JackPort* port = lst->ItemAt(i); if (!port->IsConnected()) return false; } return true; }
status_t ClientNode::PrepareToConnect(const media_source &src, const media_destination &dst, media_format *format, media_source *out_source, char *name) { printf("ClientNode::PrepareToConnect\n"); if (dst.port == ControlPort()) return B_MEDIA_BAD_SOURCE; if (src.port != ControlPort() || src.id != 0) return B_MEDIA_BAD_SOURCE; if (format->type != B_MEDIA_RAW_AUDIO && format->type != B_MEDIA_UNKNOWN_TYPE) { return B_MEDIA_BAD_FORMAT; } JackPort* port; JackPortList* outputs = fOwner->GetOutputPorts(); for (int i = 0; i < outputs->CountItems(); i++) { port = outputs->ItemAt(i); media_output* output = port->MediaOutput(); if (output->source.id == src.id && output->destination.id == dst.id) { if (port->IsConnected()) return B_MEDIA_ALREADY_CONNECTED; *out_source = src; BString portName(jack_port_name((jack_port_t*) port)); portName.CopyInto(name, 0, portName.Length()); printf("Connecting to %s\n", name); format->SpecializeTo(&fFormat); return B_OK; } } return B_MEDIA_BAD_SOURCE; }
status_t ClientNode::_InitOutputPorts() { //printf("JackClient::_InitOutputPorts()\n"); JackPortList* outputPorts = fOwner->GetOutputPorts(); for (int i = 0; i < outputPorts->CountItems(); i++) { JackPort* port = outputPorts->ItemAt(i); if (!port->IsConnected()) return B_ERROR; BBuffer* buffer = fBufferGroup->RequestBuffer( fFormat.u.raw_audio.buffer_size); if (buffer == NULL || buffer->Data() == NULL) { printf("RequestBuffer failed\n"); return B_ERROR; } port->SetProcessingBuffer(buffer); } return B_OK; }