Autor Thema: API-Funktion set_dvbc_channel() tut's nicht  (Gelesen 5785 mal)

Marcus

  • Newbie
  • *
  • Beiträge: 3
    • Profil anzeigen
API-Funktion set_dvbc_channel() tut's nicht
« am: Oktober 10, 2013, 11:42:13 Vormittag »
Hallo zusammen,

ich habe mir vor einiger Zeit den mediatv digital home Stick gekauft (ausschließlich für DVB-C) und bin eigentlich sehr zufrieden. Obwohl ich nicht der große Linuxer bin habe ich ihn auf einem Panda-Board ohne Probleme zum Laufen gebracht.

Nun wollte ich mir mit dem API meinen eigenen PVR schreiben. Die Header-Files sind ja im Wesentlichen selbsterklärend.

Allerdings kriege ich die Funktion set_dvbc_channel nicht dazu zu tun, was sie soll (Code wie folgt):

uint32_t fr = 137000000;
uint32_t sr = 6900000;
uint8_t quam[4] = { 'Q','6','4',0 };
uint8_t mode[5] = { 'D','V','B','C',0 };
int rv;
rv = set_dtvmode(0, mode);
rv = set_dvbc_channel(0, fr, sr, quam);
get_lock(0);

rv ist immer 0, was ja wohl ein gutes Zeichen sein sollte !?
Aber Frequenz, symbol rate und quam werden micht gesetzt, demzufolge auch kein lock.

Dagegen funktioniert das Setzen über mediaclient einwandfei:
char tuneCommand[61]="/opt/bin/mediaclient -m DVBC -f 137000000 -M Q64 -S 6900000\0";
system(tuneCommand);

Auch des Einrichten des Hardware PID-Filters funktioniert ohne Probleme:
dvb_flushpids(0);
dvb_add_pids(0,101);
dvb_add_pids(0,102);
dvb_hw_pidfilter(0,1);

Mach ich was falsch oder ist das 'n Bug?
Hat es schon jemand hingekriegt?

Freue mich über jeden Hinweis.

Grüsse, Marcus



 


 

Sundtek

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 8514
    • Profil anzeigen
Re:API-Funktion set_dvbc_channel() tut's nicht
« Antwort #1 am: Oktober 10, 2013, 02:54:12 Nachmittag »
Das erste Argument sollte der Filedescriptor des DVB Tuners sein, wir werden etwas später ein Codeschnipsel reinstellen.
Failure is a good thing! I'll fix it

Sundtek

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 8514
    • Profil anzeigen
Re:API-Funktion set_dvbc_channel() tut's nicht
« Antwort #2 am: Oktober 10, 2013, 10:44:37 Nachmittag »
Zitat
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include "mediaclient.h"

int main() {
  int ret;
  uint32_t frequency=121000000;
  uint32_t symbolrate=6900000;
  uint8_t *modulation="Q256";
  char device[]="/dev/dvb/adapter0/frontend0";
  fd = net_open(device, O_RDWR);
  if (fd>=0) {
      set_dvbc_channel(fd, frequency, symbolrate, modulation);
      ret = get_lock(fd);
      net_close(fd);
  }
  return 0;
}

Immer den Filedescriptor mitübergeben ansonsten klappt das ganze nicht.
« Letzte Änderung: Oktober 11, 2013, 12:16:19 Vormittag von Sundtek »
Failure is a good thing! I'll fix it

Marcus

  • Newbie
  • *
  • Beiträge: 3
    • Profil anzeigen
Re:API-Funktion set_dvbc_channel() tut's nicht
« Antwort #3 am: Oktober 11, 2013, 10:09:34 Vormittag »
Hallo,

vielen Dank für die schnelle Antwort!!

Jetzt funzt es einwandfrei.

Irgendwie war ich davon ausgegangen, dass ich mit der 0 als ersten Parameter auf adapter0/frontend0 referenziere.
Aber so ist es natürlich logischer.

Bei der Gelegenheit gleich noch eine Frage:
Zum Lesen des TS öffne ich adapter0/dvr0 mit open() und lese mit read().
Schickt der Stick die Daten in 512 Byte Paketen (vom System angegebene maximale Paketgröße im bulk mode)
oder in den 188 Byte Paketen des TS?
Da die Hardware kleiner Boards wie Panda oder Raspberry ja nicht zu üppig ist, wäre das zur Performance-optimierung sicher ineressant, obwohl ich damit nicht wirklich Probleme habe.

Ciao, Marcus

PS: Echt cooles Teil euer Stick
 

Sundtek

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 8514
    • Profil anzeigen
Re:API-Funktion set_dvbc_channel() tut's nicht
« Antwort #4 am: Oktober 11, 2013, 11:25:13 Vormittag »
Es sind 512 Bytes.
Man kann vom Treiber sogar eine Notifikation erhalten welches Gerät angeschlossen / abgesteckt wird (inkl Seriennummer / Devicenodes).

Der erste USB DVB Adapter muss nicht immer 0 sein (üblicherweise wenn man nur einen Stick von uns hat ist es jedoch in der Tat immer 0).

bitte immer

net_read
net_open
net_close
net_ioctl
etc.

verwenden wenn auf den Tuner zugegriffen wird, das ist die offizielle direkte API.
Das Modul libmcsimple.so exportiert alle diese Funktionen.

Man kann auch mit open/close/etc zugreifen jedoch ist die Applikation dann nicht portabel.
Der Treiber läuft ja mit verschiedenen Betriebssystemen (unter anderem auch MacOSX).
« Letzte Änderung: Oktober 11, 2013, 02:56:09 Nachmittag von Sundtek »
Failure is a good thing! I'll fix it

Marcus

  • Newbie
  • *
  • Beiträge: 3
    • Profil anzeigen
Re:API-Funktion set_dvbc_channel() tut's nicht
« Antwort #5 am: Oktober 11, 2013, 12:14:09 Nachmittag »
Danke für die Info's!!!

Echt klasse Support bei euch ...