Hello
I still try to write a Plugin which a background receiving of data.
For example I have 3 devices.
I want the last device to receive data only from "Transponder A" with
"PID X". This should be a very high prio.
The user should tune as he likes.
Now I want to receive "Transponder B" with "PID Y", but with a low Prio.
So the user don't observe it.
The low prio receiver should be detached if a user need the device.
The Problem is that the user action don't detach the receiver.
How can I implement it?
Patrick
So I have written this code:
#define PRIORECEIVER 59
struct sReceiverID{
cDevice *device;
cPTSReceiver *receiver;
int originalNetworkId;
int transportStreamId;
int serviceId;
int vpid;
};
/**
* Start listening for PTS values on the given service.
*
* Step1. create the channel for the values
* Step2. get next free receiver position in array
* Step3. test if allready a receiver is listen to the values, if exist
return
* Step4. test if allready a receiver is listen on same transponder. if
exist create a new receiver and add to same device. return
* Step5. test if static device can receive data. If it could, create a
device and add to static device and return
* Step6. test all other devices and add the first fit device. return
* Step7. return with false. No device can handel a receiver with this
valuse.
*/
bool ctuner::addPTSStream(int originalNetworkId, int transportStreamId,
int serviceId){
//DEBUG
/* for (int b=0;b<MAXRECEIVERS;b++){
if (receiverID[b].originalNetworkId){
dsyslog("receiverID[%d].",b);
dsyslog(" %d) ONID: %d",b,receiverID[b].originalNetworkId);
dsyslog(" %d) TSID: %d",b,receiverID[b].transportStreamId);
dsyslog(" %d) SID: %d \n",b,receiverID[b].serviceId);
dsyslog(" lisen on
device[%d]",receiverID[b].device->DeviceNumber());
}
}; */
//DEBUG END
//create the fitting channel for the originalNetworkId,
transportStreamId and serviceId
cChannel *channel =
GetChannelBy_ONID_TID_SID(originalNetworkId,transportStreamId,serviceId);
if(!channel)return false;//can't read channel from file
else{
// dsyslog("channels with originalNetworkId = %d,
transportStreamId = %d and serviceId = %d was found and has
VPID=%d",originalNetworkId,transportStreamId,serviceId,channel->Vpid());
}
//create a receiver for the VPID
cPTSReceiver *receiver = NULL;
int a;
for (a=0;((receiverID[a].receiver!=NULL) &&
(a<MAXRECEIVERS));a++){};
if (receiverID[a].receiver){
esyslog("MAXRECEIVER reached");
return false;//max receivers was reached
}
//check if already a receiver is set to the originalNetworkId,
transportStreamId and serviceId.
// if a receiver with the same originalNetworkId, transportStreamId
and serviceId were found,
// no new receiver was needed.
for(int i=0;i < MAXRECEIVER;i++){
if ((receiverID[i].originalNetworkId == originalNetworkId) &&
(receiverID[i].transportStreamId == transportStreamId) &&
(receiverID[i].serviceId == serviceId)){
//there is already a receiver set to this IDs
//dsyslog("There is already a receiver listen to the
IDS: %d, %d ,%d",originalNetworkId, transportStreamId, serviceId);
return true;//not need to attach new receiver
}
}//no receiver found for this IDs lets create a new receiver
//dsyslog("VPID from channel is: %d",channel->Vpid()),
receiver = new cPTSReceiver(channel->Vpid());
if(!receiver){
dsyslog("receiver failed");
return false;
}
receiverID[a].receiver = receiver;
receiverID[a].originalNetworkId =0;//will be set later
receiverID[a].transportStreamId =0;//will be set later
receiverID[a].serviceId =serviceId;
receiverID[a].device = NULL;//will be set later if device was known
receiverID[a].vpid = channel->Vpid();
//dsyslog("new PTSReceiver was created for VPID=%d",channel->Vpid());
// If a receiver with the same originalNetworkId and transportStreamId
// were found, the device of this receiver is tuned to the same
originalNetworkId, transportStreamId
// the new receiver need, so I can attach the new receiver to the
same device
for(int i=0;i < MAXRECEIVER;i++){
if ((receiverID[i].originalNetworkId == originalNetworkId) &&
(receiverID[i].transportStreamId == transportStreamId)){
//there is already a receiver on the same transponder
//dsyslog("There is already a receiver on the same
transponder IDS: %d, %d, added ",originalNetworkId, transportStreamId);
if (!receiverID[i].device->AttachReceiver(receiver)){
esyslog("ERROR could not attach receiver to same
transponder. reason unknown");
delete receiver;
receiverID[a].receiver = NULL;
receiverID[a].originalNetworkId = 0;
receiverID[a].transportStreamId = 0;
receiverID[a].serviceId = 0;
receiverID[a].device = NULL;
receiverID[a].vpid = 0;
return false;//could not attach receiver, reason unknown
}
receiverID[a].device = receiverID[i].device;
receiverID[a].originalNetworkId =originalNetworkId;
receiverID[a].transportStreamId =transportStreamId;
dsyslog("added to
device[%d]",receiverID[a].device->DeviceNumber());
return true;//new receiver was added to same device
}
}
//not I need to test all other devices to receive the data
cDevice *device;
//check the last device first, because it is static tuned on a
transponder and will not change
device = cDevice::GetDevice(cDevice::NumDevices()-2);//TODO in case
of xine the last one is the xine device so use -2 else -1
if(device->ProvidesChannel(channel,PRIORECEIVER)){
//dsyslog(" static device can receive PTSStream");
device->SwitchChannel(channel,false);
if (!device->AttachReceiver(receiver)){
esyslog("ERROR could not attach receiver to static
device.");
}else{
receiverID[a].device = device;
receiverID[a].originalNetworkId =originalNetworkId;
receiverID[a].transportStreamId =transportStreamId;
dsyslog("added to
device[%d]",receiverID[a].device->DeviceNumber());
return true;//successful added
}
}
else {
//dsyslog(" static device can't receive PTSStream");
}
//check all other devices if the receiver can be added
for (int i= cDevice::NumDevices()-2; i>=0 ;i--){
device = cDevice::GetDevice(i);
if(device->ProvidesChannel(channel,PRIORECEIVER)){
//dsyslog(" device[%d] can receive PTSStream",i);
device->SwitchChannel(channel,false);
if (!device->AttachReceiver(receiver)){
esyslog("ERROR could not attach receiver to device[%d].",i);
}else{
// dsyslog("successful added receiver to device[%d]",i);
receiverID[a].originalNetworkId =originalNetworkId;
receiverID[a].transportStreamId =transportStreamId;
receiverID[a].device = device;
dsyslog("added to
device[%d]",receiverID[a].device->DeviceNumber());
return true;//successful added
}
}
else{
// dsyslog(" device[%d] can't receive PTSStream",i);
}
}
//no device can handel the originalNetworkId, transportStreamId and
serviceId
// so clean up and exit with false
// dsyslog("no device found for VPID=%d",receiverID[a].vpid);
delete receiver;
receiverID[a].receiver = NULL;
//not needed but make it clean
receiverID[a].originalNetworkId =0;
receiverID[a].transportStreamId =0;
receiverID[a].serviceId =0;
receiverID[a].receiver = NULL;
receiverID[a].vpid = 0;
return false;
}