… | |
… | |
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 | |
246 | static void |
246 | static void |
247 | set_parameters (HV *hv, struct dvb_frontend_parameters *p, fe_type_t type) |
247 | get_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 | |
|
|
281 | static void |
|
|
282 | set_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 | |
275 | typedef unsigned char u8; |
312 | typedef unsigned char u8; |
276 | |
313 | |
277 | static SV *dec_sv; |
314 | static SV *dec_sv; |
278 | static u8 *dec_data; |
315 | static u8 *dec_data; |
279 | static long dec_ofs, dec_len8; |
316 | static long dec_ofs, dec_len8; |
… | |
… | |
325 | } |
362 | } |
326 | |
363 | |
327 | return dec_field = r; |
364 | return dec_field = r; |
328 | } |
365 | } |
329 | |
366 | |
|
|
367 | U32 |
|
|
368 | clamp (U32 len) |
|
|
369 | { |
|
|
370 | return len < 4096 ? len : 0; |
|
|
371 | } |
|
|
372 | |
330 | static SV * |
373 | static SV * |
331 | text2sv (u8 *data, U32 len) |
374 | text2sv (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 | |
348 | static AV * |
391 | static AV * |
349 | decode_descriptors (long end) |
392 | decode_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 | |
|
|
643 | int |
|
|
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 | |
585 | SV * |
660 | SV * |
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 | |
600 | SV * |
675 | SV * |
… | |
… | |
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 | |
616 | MODULE = Linux::DVB PACKAGE = Linux::DVB::Demux |
691 | MODULE = Linux::DVB PACKAGE = Linux::DVB::Demux |