ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Linux-DVB/DVB.xs
(Generate patch)

Comparing Linux-DVB/DVB.xs (file contents):
Revision 1.2 by root, Wed Sep 8 19:47:30 2004 UTC vs.
Revision 1.3 by root, Sun Apr 3 02:16:05 2005 UTC

242#define HVS_S(hv,struct,member) hv_store (hv, #member, sizeof (#member) - 1, newSVpv (struct.member, 0), 0) 242#define HVS_S(hv,struct,member) hv_store (hv, #member, sizeof (#member) - 1, newSVpv (struct.member, 0), 0)
243#define HVS_I(hv,struct,member) hv_store (hv, #member, sizeof (#member) - 1, newSViv (struct.member), 0) 243#define HVS_I(hv,struct,member) hv_store (hv, #member, sizeof (#member) - 1, newSViv (struct.member), 0)
244#define HVS(hv,name,sv) hv_store (hv, #name, sizeof (#name) - 1, (sv), 0) 244#define HVS(hv,name,sv) hv_store (hv, #name, sizeof (#name) - 1, (sv), 0)
245 245
246static void 246static void
247set_parameters (HV *hv, struct dvb_frontend_parameters *p, fe_type_t type) 247get_parameters (HV *hv, struct dvb_frontend_parameters *p, fe_type_t type)
248{ 248{
249 HVS_I (hv, (*p), frequency); 249 HVS_I (hv, (*p), frequency);
250 HVS_I (hv, (*p), inversion); 250 HVS_I (hv, (*p), inversion);
251 251
252 switch (type) 252 switch (type)
270 HVS_I (hv, (*p).u.ofdm, transmission_mode); 270 HVS_I (hv, (*p).u.ofdm, transmission_mode);
271 break; 271 break;
272 } 272 }
273} 273}
274 274
275#define HVF_I(hv,struct,member) \
276 if (v = hv_fetch (hv, #member, sizeof (#member) - 1, 0)) \
277 struct.member = SvIV (*v); \
278 else \
279 croak ("required hash key '%s' not specified", #member);
280
281static void
282set_parameters (HV *hv, struct dvb_frontend_parameters *p, fe_type_t type)
283{
284 SV **v;
285
286 HVF_I (hv, (*p), frequency);
287 HVF_I (hv, (*p), inversion);
288
289 switch (type)
290 {
291 case FE_QPSK:
292 HVF_I (hv, (*p).u.qpsk, symbol_rate);
293 HVF_I (hv, (*p).u.qpsk, fec_inner);
294 break;
295
296 case FE_QAM:
297 HVF_I (hv, (*p).u.qam, symbol_rate);
298 HVF_I (hv, (*p).u.qam, fec_inner);
299 HVF_I (hv, (*p).u.qam, modulation);
300 break;
301
302 case FE_OFDM:
303 HVF_I (hv, (*p).u.ofdm, bandwidth);
304 HVF_I (hv, (*p).u.ofdm, code_rate_HP);
305 HVF_I (hv, (*p).u.ofdm, code_rate_LP);
306 HVF_I (hv, (*p).u.ofdm, constellation);
307 HVF_I (hv, (*p).u.ofdm, transmission_mode);
308 break;
309 }
310}
311
275typedef unsigned char u8; 312typedef unsigned char u8;
276 313
277static SV *dec_sv; 314static SV *dec_sv;
278static u8 *dec_data; 315static u8 *dec_data;
279static long dec_ofs, dec_len8; 316static long dec_ofs, dec_len8;
325 } 362 }
326 363
327 return dec_field = r; 364 return dec_field = r;
328} 365}
329 366
367U32
368clamp (U32 len)
369{
370 return len < 4096 ? len : 0;
371}
372
330static SV * 373static SV *
331text2sv (u8 *data, U32 len) 374text2sv (u8 *data, U32 len)
332{ 375{
333 dSP; 376 dSP;
334 SV *sv = newSVpvn (data, len); 377 SV *sv = newSVpvn (data, clamp (len));
335 378
336 PUSHMARK (SP); 379 PUSHMARK (SP);
337 XPUSHs (sv); 380 XPUSHs (sv);
338 PUTBACK; 381 PUTBACK;
339 call_pv ("Linux::DVB::Decode::text", G_VOID); 382 call_pv ("Linux::DVB::Decode::text", G_VOID);
340 383
341 return sv; 384 return sv;
342} 385}
343 386
344#define DEC_I(hv, bits, name) HVS (hv, name, newSViv (decode_field (bits))) 387#define DEC_I(hv, bits, name) HVS (hv, name, newSViv (decode_field (bits)))
345#define DEC_T(hv, bytes, name) HVS (hv, name, text2sv (dec_data + (dec_ofs >> 3), (bytes))), dec_ofs += (bytes) << 3 388#define DEC_T(hv, bytes, name) HVS (hv, name, text2sv (dec_data + (dec_ofs >> 3), clamp (bytes))), dec_ofs += clamp (bytes) << 3
346#define DEC_S(hv, bytes, name) HVS (hv, name, newSVpvn (dec_data + (dec_ofs >> 3), (bytes))), dec_ofs += (bytes) << 3 389#define DEC_S(hv, bytes, name) HVS (hv, name, newSVpvn (dec_data + (dec_ofs >> 3), clamp (bytes))), dec_ofs += clamp (bytes) << 3
347 390
348static AV * 391static AV *
349decode_descriptors (long end) 392decode_descriptors (long end)
350{ 393{
351 AV *av = newAV (); 394 AV *av = newAV ();
448 491
449 len2 = decode_field (8); DEC_T (hv, len2, text); 492 len2 = decode_field (8); DEC_T (hv, len2, text);
450 break; 493 break;
451 494
452 case DT_content: 495 case DT_content:
453 DEC_S (hv, len, content); 496 av2 = newAV ();
497 HVS (hv, items, newRV_noinc ((SV *)av2));
498
499 while (dec_ofs < end)
500 {
501 HV *ev = newHV ();
502
503 DEC_I (ev, 4, content_nibble_level_1);
504 DEC_I (ev, 4, content_nibble_level_2);
505 DEC_I (ev, 4, user_nibble_1);
506 DEC_I (ev, 4, user_nibble_2);
507
508 av_push (av2, newRV_noinc ((SV *)ev));
509 }
510
454 break; 511 break;
455 512
456 case DT_private_data_specifier: 513 case DT_private_data_specifier:
457 DEC_I (hv, 32, private_data_specifier); 514 DEC_I (hv, 32, private_data_specifier);
458 break; 515 break;
459 516
460 default: 517 default:
461 fprintf (stderr, "UNKXXX %x\n", type);//D 518 //fprintf (stderr, "UNKXXX %x\n", type);//D
519
462 case 0: 520 case 0:
463 case 0x80: 521 case 0x80:
464 case 0x81: 522 case 0x81:
465 case 0x82: 523 case 0x82:
466 case 0x83: 524 case 0x83:
580 638
581 RETVAL = ubl; 639 RETVAL = ubl;
582 OUTPUT: 640 OUTPUT:
583 RETVAL 641 RETVAL
584 642
643int
644_set (int fd, SV *parameters, int type)
645 CODE:
646 struct dvb_frontend_parameters p;
647
648 if (!SvROK (parameters) || SvTYPE (SvRV (parameters)) != SVt_PVHV)
649 croak ("Linux::DVB::Frontend::set requires a hash as argument");
650
651 set_parameters ((HV *)SvRV (parameters), &p, type);
652
653 if (ioctl (fd, FE_SET_FRONTEND, &p) < 0)
654 XSRETURN_UNDEF;
655
656 RETVAL = 1;
657 OUTPUT:
658 RETVAL
659
585SV * 660SV *
586_get (int fd, int type) 661_get (int fd, int type)
587 CODE: 662 CODE:
588 struct dvb_frontend_parameters p; 663 struct dvb_frontend_parameters p;
589 HV *hv; 664 HV *hv;
590 665
591 if (ioctl (fd, FE_GET_FRONTEND, &p) < 0) 666 if (ioctl (fd, FE_GET_FRONTEND, &p) < 0)
592 XSRETURN_UNDEF; 667 XSRETURN_UNDEF;
593 668
594 hv = newHV (); 669 hv = newHV ();
595 set_parameters (hv, &p, type); 670 get_parameters (hv, &p, type);
596 RETVAL = (SV *)newRV_noinc ((SV *)hv); 671 RETVAL = (SV *)newRV_noinc ((SV *)hv);
597 OUTPUT: 672 OUTPUT:
598 RETVAL 673 RETVAL
599 674
600SV * 675SV *
606 if (ioctl (fd, FE_GET_EVENT, &e) < 0) 681 if (ioctl (fd, FE_GET_EVENT, &e) < 0)
607 XSRETURN_UNDEF; 682 XSRETURN_UNDEF;
608 683
609 hv = newHV (); 684 hv = newHV ();
610 HVS_I (hv, e, status); 685 HVS_I (hv, e, status);
611 set_parameters (hv, &e.parameters, type); 686 get_parameters (hv, &e.parameters, type);
612 RETVAL = (SV *)newRV_noinc ((SV *)hv); 687 RETVAL = (SV *)newRV_noinc ((SV *)hv);
613 OUTPUT: 688 OUTPUT:
614 RETVAL 689 RETVAL
615 690
616MODULE = Linux::DVB PACKAGE = Linux::DVB::Demux 691MODULE = Linux::DVB PACKAGE = Linux::DVB::Demux

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines