Mercurial > pt1.oyama
comparison src/recpt1.c @ 164:7d8a5bb874ad
EXPERIMENTAL: Change phisical channel by mq_recv().
KNOWN ISSUE: Cannnot split BS-TBS(BS1_1).
enable compile recpt1ctl.
SID can specified by recpt1ctl.
| author | Naoya OYAMA <naoya.oyama@gmail.com> |
|---|---|
| date | Mon, 01 Oct 2012 21:52:05 +0900 |
| parents | 57eae2aec60d |
| children | 726fe10d9e4a |
comparison
equal
deleted
inserted
replaced
| 163:57eae2aec60d | 164:7d8a5bb874ad |
|---|---|
| 34 #include <sys/msg.h> | 34 #include <sys/msg.h> |
| 35 #include "pt1_dev.h" | 35 #include "pt1_dev.h" |
| 36 #include "tssplitter_lite.h" | 36 #include "tssplitter_lite.h" |
| 37 #include "ushare.h" | 37 #include "ushare.h" |
| 38 #include "trace.h" | 38 #include "trace.h" |
| 39 #include "pt1_common.h" | |
| 39 | 40 |
| 40 /* maximum write length at once */ | 41 /* maximum write length at once */ |
| 41 #define SIZE_CHANK 1316 | 42 #define SIZE_CHANK 1316 |
| 42 | 43 |
| 43 /* ipc message size */ | |
| 44 #define MSGSZ 255 | |
| 45 | |
| 46 #define ISDB_T_NODE_LIMIT 24 // 32:ARIB limit 24:program maximum | 44 #define ISDB_T_NODE_LIMIT 24 // 32:ARIB limit 24:program maximum |
| 47 #define ISDB_T_SLOT_LIMIT 8 | 45 #define ISDB_T_SLOT_LIMIT 8 |
| 48 | |
| 49 typedef struct pt1_msgbuf { | |
| 50 long mtype; | |
| 51 char mtext[MSGSZ]; | |
| 52 } pt1_message_buf; | |
| 53 | 46 |
| 54 /* globals */ | 47 /* globals */ |
| 55 boolean f_exit = FALSE; | 48 boolean f_exit = FALSE; |
| 56 struct channel_info_list *channel_list = NULL; | 49 struct channel_info_list *channel_list = NULL; |
| 57 extern struct ushare_t *ut; | 50 extern struct ushare_t *ut; |
| 165 void * | 158 void * |
| 166 mq_recv(void *t) | 159 mq_recv(void *t) |
| 167 { | 160 { |
| 168 thread_data *tdata = (thread_data *)t; | 161 thread_data *tdata = (thread_data *)t; |
| 169 pt1_message_buf rbuf; | 162 pt1_message_buf rbuf; |
| 170 char channel[16]; | 163 static char channel[16]; |
| 171 int ch = 0, recsec = 0, time_to_add = 0; | 164 static char sid_list[16]; |
| 165 int recsec = 0, time_to_add = 0; | |
| 166 int current_type; | |
| 167 splitter *splitter = tdata->splitter; | |
| 168 boolean use_splitter = splitter ? TRUE : FALSE; | |
| 169 boolean use_dlna = tdata->streamer ? TRUE : FALSE; | |
| 170 ISDB_T_FREQ_CONV_TABLE *table = NULL; | |
| 172 | 171 |
| 173 while(1) { | 172 while(1) { |
| 174 if(msgrcv(tdata->msqid, &rbuf, MSGSZ, 1, 0) < 0) { | 173 if(msgrcv(tdata->msqid, &rbuf, MSGSZ, 1, 0) < 0) { |
| 175 return NULL; | 174 return NULL; |
| 176 } | 175 } |
| 177 | 176 |
| 178 sscanf(rbuf.mtext, "ch=%s t=%d e=%d", channel, &recsec, &time_to_add); | 177 sscanf(rbuf.mtext, "ch=%s t=%d e=%d i=%s", channel, &recsec, &time_to_add, sid_list); |
| 179 ch = atoi(channel); | 178 |
| 180 // fprintf(stderr, "ch=%d time=%d extend=%d\n", ch, recsec, time_to_add); | 179 if ((strcmp(channel, "")) && strcmp(tdata->ch, channel)) { |
| 181 | |
| 182 if(ch && tdata->ch != ch) { | |
| 183 #if 0 | 180 #if 0 |
| 184 /* re-initialize decoder */ | 181 /* re-initialize decoder */ |
| 185 if(tdata->decoder) { | 182 if(tdata->decoder) { |
| 186 // b25_finish(tdata->decoder); | 183 // b25_finish(tdata->decoder); |
| 187 b25_shutdown(tdata->decoder); | 184 b25_shutdown(tdata->decoder); |
| 190 fprintf(stderr, "Cannot start b25 decoder\n"); | 187 fprintf(stderr, "Cannot start b25 decoder\n"); |
| 191 fprintf(stderr, "Fall back to encrypted recording\n"); | 188 fprintf(stderr, "Fall back to encrypted recording\n"); |
| 192 } | 189 } |
| 193 } | 190 } |
| 194 #endif | 191 #endif |
| 195 int current_type = tdata->table->type; | 192 current_type = tdata->table->type; |
| 196 ISDB_T_FREQ_CONV_TABLE *table = searchrecoff(channel); | 193 table = searchrecoff(channel); |
| 197 if (table == NULL) { | 194 if (table == NULL) { |
| 198 fprintf(stderr, "Invalid Channel: %s\n", channel); | 195 fprintf(stderr, "Invalid Channel: %s\n", channel); |
| 199 goto CHECK_TIME_TO_ADD; | 196 goto CHECK_TIME_TO_ADD; |
| 200 } | 197 } |
| 201 tdata->table = table; | 198 tdata->table = table; |
| 205 | 202 |
| 206 /* wait for remainder */ | 203 /* wait for remainder */ |
| 207 while(tdata->queue->num_used > 0) { | 204 while(tdata->queue->num_used > 0) { |
| 208 usleep(10000); | 205 usleep(10000); |
| 209 } | 206 } |
| 210 | 207 } |
| 208 if (use_splitter && | |
| 209 (strcmp(tdata->sid_list, sid_list) || | |
| 210 strcmp(tdata->ch, channel))) { | |
| 211 // $BJ*M}%A%c%s%M%kJQ99;~$K$O(B splitter $B$O6/@)E*$K:F5/F0$5$;$k(B | |
| 212 pthread_mutex_lock(&tdata->splitter_mutex); | |
| 213 split_shutdown(splitter); | |
| 214 splitter = split_startup(sid_list, NULL, NULL); | |
| 215 if (splitter->sid_list == NULL) { | |
| 216 fprintf (stderr, "reader_func() splitter RESTART FAILED.\n"); | |
| 217 tdata->splitter = NULL; | |
| 218 pthread_mutex_unlock(&tdata->splitter_mutex); | |
| 219 continue; | |
| 220 } | |
| 221 if (tdata->streamer) { | |
| 222 pthread_mutex_lock(&tdata->stream_queue->mutex); | |
| 223 while(1) { | |
| 224 STREAM_QUEUE_T *p_queue = tdata->stream_queue; | |
| 225 if (p_queue->num_used == 0) | |
| 226 break; | |
| 227 free(p_queue->buffer[p_queue->out]->data); | |
| 228 p_queue->buffer[p_queue->out]->data = NULL; | |
| 229 free(p_queue->buffer[p_queue->out]); | |
| 230 p_queue->buffer[p_queue->out] = NULL; | |
| 231 p_queue->out++; | |
| 232 p_queue->out %= p_queue->size; | |
| 233 | |
| 234 /* update counters */ | |
| 235 p_queue->num_avail++; | |
| 236 p_queue->num_used--; | |
| 237 } | |
| 238 pthread_mutex_unlock(&tdata->stream_queue->mutex); | |
| 239 } | |
| 240 tdata->table = table; | |
| 241 tdata->splitter = splitter; | |
| 242 time(&splitter->split_start_time); | |
| 243 strncpy(tdata->sid_list, sid_list, sizeof(tdata->sid_list)); | |
| 244 pthread_mutex_unlock(&tdata->splitter_mutex); | |
| 245 } | |
| 246 | |
| 247 if (strcmp(tdata->ch, channel)) { | |
| 211 if (tdata->table->type != current_type) { | 248 if (tdata->table->type != current_type) { |
| 212 /* re-open device */ | 249 /* re-open device */ |
| 213 if(close_tuner(tdata) != 0) | 250 if(close_tuner(tdata) != 0) |
| 214 return NULL; | 251 return NULL; |
| 215 | 252 |
| 216 tune(channel, tdata, NULL); | 253 tune(channel, tdata, NULL); |
| 217 } else { | 254 } else { |
| 218 /* SET_CHANNEL only */ | 255 /* SET_CHANNEL only */ |
| 219 const FREQUENCY freq = { | 256 const FREQUENCY freq = { |
| 220 .frequencyno = tdata->table->set_freq, | 257 .frequencyno = tdata->table->set_freq, |
| 221 .slot = tdata->table->add_freq, | 258 .slot = tdata->table->add_freq, |
| 222 }; | 259 }; |
| 223 if(ioctl(tdata->tfd, SET_CHANNEL, &freq) < 0) { | 260 if(ioctl(tdata->tfd, SET_CHANNEL, &freq) < 0) { |
| 224 fprintf(stderr, "Cannot tune to the specified channel\n"); | 261 fprintf(stderr, "Cannot tune to the specified channel\n"); |
| 225 tdata->ch = 0; | 262 tdata->ch[0] = '\0'; |
| 226 goto CHECK_TIME_TO_ADD; | 263 goto CHECK_TIME_TO_ADD; |
| 227 } | 264 } |
| 228 tdata->ch = ch; | |
| 229 calc_cn(tdata->tfd, tdata->table->type); | 265 calc_cn(tdata->tfd, tdata->table->type); |
| 230 } | 266 } |
| 231 /* restart recording */ | 267 /* restart recording */ |
| 232 if(ioctl(tdata->tfd, START_REC, 0) < 0) { | 268 if(ioctl(tdata->tfd, START_REC, 0) < 0) { |
| 233 fprintf(stderr, "Tuner cannot start recording\n"); | 269 fprintf(stderr, "Tuner cannot start recording\n"); |
| 234 return NULL; | 270 return NULL; |
| 235 } | 271 } |
| 272 strncpy(tdata->ch, channel, sizeof(tdata->ch)); | |
| 236 } | 273 } |
| 237 | 274 |
| 238 CHECK_TIME_TO_ADD: | 275 CHECK_TIME_TO_ADD: |
| 239 if(time_to_add) { | 276 if(time_to_add) { |
| 240 tdata->recsec += time_to_add; | 277 tdata->recsec += time_to_add; |
| 250 else { | 287 else { |
| 251 tdata->recsec = recsec; | 288 tdata->recsec = recsec; |
| 252 fprintf(stderr, "Total recording time = %d sec\n", recsec); | 289 fprintf(stderr, "Total recording time = %d sec\n", recsec); |
| 253 } | 290 } |
| 254 } | 291 } |
| 255 | |
| 256 if(f_exit) | 292 if(f_exit) |
| 257 return NULL; | 293 return NULL; |
| 258 } | 294 } |
| 259 } | 295 } |
| 260 | 296 |
| 550 reader_func(void *p) | 586 reader_func(void *p) |
| 551 { | 587 { |
| 552 thread_data *data = (thread_data *)p; | 588 thread_data *data = (thread_data *)p; |
| 553 QUEUE_T *p_queue = data->queue; | 589 QUEUE_T *p_queue = data->queue; |
| 554 decoder *dec = data->decoder; | 590 decoder *dec = data->decoder; |
| 555 splitter *splitter = data->splitter; | |
| 556 int wfd = data->wfd; | 591 int wfd = data->wfd; |
| 557 boolean use_b25 = dec ? TRUE : FALSE; | 592 boolean use_b25 = dec ? TRUE : FALSE; |
| 558 boolean use_udp = data->sock_data ? TRUE : FALSE; | 593 boolean use_udp = data->sock_data ? TRUE : FALSE; |
| 559 boolean fileless = FALSE; | 594 boolean fileless = FALSE; |
| 560 boolean use_splitter = splitter ? TRUE : FALSE; | 595 boolean use_splitter = data->splitter ? TRUE : FALSE; |
| 561 boolean use_dlna = data->streamer ? TRUE : FALSE; | 596 boolean use_dlna = data->streamer ? TRUE : FALSE; |
| 562 int sfd = -1; | 597 int sfd = -1; |
| 563 pthread_t signal_thread = data->signal_thread; | 598 pthread_t signal_thread = data->signal_thread; |
| 564 struct sockaddr_in *addr = NULL; | 599 struct sockaddr_in *addr = NULL; |
| 565 BUFSZ *qbuf; | 600 BUFSZ *qbuf; |
| 566 ARIB_STD_B25_BUFFER *eqbuf; | 601 ARIB_STD_B25_BUFFER *eqbuf; |
| 567 splitbuf_t splitbuf; | 602 splitbuf_t splitbuf; |
| 568 ARIB_STD_B25_BUFFER sbuf, dbuf, buf; | 603 ARIB_STD_B25_BUFFER sbuf, dbuf, buf; |
| 569 int code; | 604 int code; |
| 570 int split_select_finish = TSS_ERROR; | 605 pt1_message_buf mbuf; |
| 571 int old_sid = 0, new_sid = 0; | 606 int msqid; |
| 572 char *old_tp = NULL, *new_tp = NULL; | 607 int msgflg = IPC_CREAT | 0666; |
| 573 time_t split_start_time; | 608 |
| 574 | 609 if (use_splitter) |
| 575 time(&split_start_time); | 610 time(&data->splitter->split_start_time); |
| 576 | 611 |
| 577 buf.size = 0; | 612 buf.size = 0; |
| 578 buf.data = NULL; | 613 buf.data = NULL; |
| 579 splitbuf.size = 0; | 614 splitbuf.size = 0; |
| 580 splitbuf.buffer_length = 0; | 615 splitbuf.buffer_length = 0; |
| 611 else | 646 else |
| 612 buf = dbuf; | 647 buf = dbuf; |
| 613 } | 648 } |
| 614 | 649 |
| 615 if(use_splitter) { | 650 if(use_splitter) { |
| 651 pthread_mutex_lock(&data->splitter_mutex); | |
| 616 splitbuf.size = 0; | 652 splitbuf.size = 0; |
| 617 if(splitbuf.buffer_length < buf.size && buf.size > 0) { | 653 if(splitbuf.buffer_length < buf.size && buf.size > 0) { |
| 618 splitbuf.buffer = realloc(splitbuf.buffer, buf.size); | 654 splitbuf.buffer = realloc(splitbuf.buffer, buf.size); |
| 619 if(NULL == splitbuf.buffer) { | 655 if(NULL == splitbuf.buffer) { |
| 620 fprintf(stderr, "splitbuf.buffer realloc failed\n"); | 656 fprintf(stderr, "splitbuf.buffer realloc failed\n"); |
| 624 splitbuf.buffer_length = buf.size; | 660 splitbuf.buffer_length = buf.size; |
| 625 } | 661 } |
| 626 | 662 |
| 627 while(buf.size) { | 663 while(buf.size) { |
| 628 /* $BJ,N%BP>](BPID$B$NCj=P(B */ | 664 /* $BJ,N%BP>](BPID$B$NCj=P(B */ |
| 629 if(split_select_finish != TSS_SUCCESS) { | 665 if(data->splitter->split_select_finish != TSS_SUCCESS) { |
| 630 split_select_finish = split_select(splitter, &buf); | 666 data->splitter->split_select_finish = split_select(data->splitter, &buf); |
| 631 if(split_select_finish == TSS_NULL) { | 667 if(data->splitter->split_select_finish == TSS_NULL) { |
| 632 /* malloc$B%(%i!<H/@8(B */ | 668 /* malloc$B%(%i!<H/@8(B */ |
| 633 fprintf(stderr, "split_select malloc failed\n"); | 669 fprintf(stderr, "split_select malloc failed\n"); |
| 634 use_splitter = FALSE; | 670 use_splitter = FALSE; |
| 635 goto fin; | 671 goto fin; |
| 636 } | 672 } |
| 637 else if(split_select_finish != TSS_SUCCESS) { | 673 else if(data->splitter->split_select_finish != TSS_SUCCESS) { |
| 638 /* $BJ,N%BP>](BPID$B$,40A4$KCj=P$G$-$k$^$G=PNO$7$J$$(B | 674 /* $BJ,N%BP>](BPID$B$,40A4$KCj=P$G$-$k$^$G=PNO$7$J$$(B |
| 639 * 1$BICDxEYM>M5$r8+$k$H$$$$$+$b(B | 675 * 1$BICDxEYM>M5$r8+$k$H$$$$$+$b(B |
| 640 */ | 676 */ |
| 641 time_t cur_time; | 677 time_t cur_time; |
| 642 time(&cur_time); | 678 time(&cur_time); |
| 643 if(cur_time - split_start_time > 4) { | 679 if(cur_time - data->splitter->split_start_time > 4) { |
| 644 fprintf(stderr, "split_select cur_time out.\n"); | 680 fprintf(stderr, "split_select cur_time out.\n"); |
| 645 use_splitter = FALSE; | 681 use_splitter = FALSE; |
| 646 goto fin; | 682 goto fin; |
| 647 } | 683 } |
| 648 break; | 684 break; |
| 649 } | 685 } |
| 650 } | 686 } |
| 651 /* $BJ,N%BP>]0J30$r$U$k$$Mn$H$9(B */ | 687 /* $BJ,N%BP>]0J30$r$U$k$$Mn$H$9(B */ |
| 652 code = split_ts(splitter, &buf, &splitbuf); | 688 code = split_ts(data->splitter, &buf, &splitbuf); |
| 653 if(code != TSS_SUCCESS) { | 689 if(code != TSS_SUCCESS) { |
| 654 fprintf(stderr, "split_ts failed\n"); | 690 fprintf(stderr, "split_ts failed\n"); |
| 655 break; | 691 break; |
| 656 } | 692 } |
| 657 | 693 |
| 659 } /* while */ | 695 } /* while */ |
| 660 | 696 |
| 661 buf.size = splitbuf.size; | 697 buf.size = splitbuf.size; |
| 662 buf.data = splitbuf.buffer; | 698 buf.data = splitbuf.buffer; |
| 663 fin: | 699 fin: |
| 664 ; | 700 pthread_mutex_unlock(&data->splitter_mutex); |
| 665 } /* if */ | 701 } /* if */ |
| 666 | 702 |
| 667 /* | 703 /* |
| 668 * 2. reader_func$B2~B$E@(B | 704 * 2. reader_func$B2~B$E@(B |
| 669 * 2.1 tdata->p_queue $B$+$i(B dequeue() $B$7$F%9%H%j!<%`$J%G!<%?$r<hF@$9$k(B | 705 * 2.1 tdata->p_queue $B$+$i(B dequeue() $B$7$F%9%H%j!<%`$J%G!<%?$r<hF@$9$k(B |
| 676 */ | 712 */ |
| 677 /* | 713 /* |
| 678 * DLNA $B$G$NJ*M}%A%c%s%M%k!&(BSID$BJQ99$N<BAu<B83(B | 714 * DLNA $B$G$NJ*M}%A%c%s%M%k!&(BSID$BJQ99$N<BAu<B83(B |
| 679 */ | 715 */ |
| 680 if ( use_dlna && buf.size > 0 ) { | 716 if ( use_dlna && buf.size > 0 ) { |
| 681 if ( use_splitter ) { | 717 if (use_splitter && (ut->tp) && (ut->sid)) { |
| 682 if (ut->tp) { | 718 if (strcmp(data->ch, ut->tp) || |
| 683 if (!old_tp) | 719 strcmp(data->sid_list, ut->sid)) { |
| 684 old_tp = "0"; | 720 if ((msqid = msgget((key_t)getpid(), msgflg)) < 0) { |
| 685 new_tp = ut->tp; | 721 // $B%(%i!<;~$O%A%c%s%M%kJQ99%j%/%(%9%H$O$J$+$C$?$3$H$K$9$k(B |
| 686 } | 722 // $B$J$`$J$`(B |
| 687 if (ut->sid) | 723 fprintf(stderr, "msgget error.\n"); |
| 688 new_sid = atoi(ut->sid); | 724 ut->tp = data->ch; |
| 689 if ((new_tp) && (old_tp)) | 725 free(qbuf); |
| 690 if (strcmp(old_tp, new_tp)) { | 726 qbuf = NULL; |
| 691 int current_type = data->table->type; | 727 ut->sid = data->sid_list; |
| 692 ISDB_T_FREQ_CONV_TABLE *table = searchrecoff(new_tp); | 728 continue; |
| 693 if (table == NULL) { | |
| 694 fprintf(stderr, "Invalid Channel: %s\n", new_tp); | |
| 695 break; | |
| 696 } | |
| 697 data->table = table; | |
| 698 old_tp = new_tp; | |
| 699 | |
| 700 /* stop stream */ | |
| 701 ioctl(data->tfd, STOP_REC, 0); | |
| 702 pthread_mutex_lock(&data->queue->mutex); | |
| 703 while(data->queue->num_used > 0) { | |
| 704 while(1) { | |
| 705 QUEUE_T *p_queue = data->queue; | |
| 706 if (p_queue->num_used == 0) | |
| 707 break; | |
| 708 free(p_queue->buffer[p_queue->out]); | |
| 709 p_queue->buffer[p_queue->out] = NULL; | |
| 710 p_queue->out++; | |
| 711 p_queue->out %= p_queue->size; | |
| 712 | |
| 713 /* update counters */ | |
| 714 p_queue->num_avail++; | |
| 715 p_queue->num_used--; | |
| 716 } | |
| 717 } | |
| 718 pthread_mutex_unlock(&data->queue->mutex); | |
| 719 if (data->table->type != current_type) { | |
| 720 /* re-open device */ | |
| 721 if(close_tuner(data) != 0) | |
| 722 break; | |
| 723 tune(new_tp, data, NULL); | |
| 724 } else { | |
| 725 /* SET_CHANNEL only */ | |
| 726 const FREQUENCY freq = { | |
| 727 .frequencyno = data->table->set_freq, | |
| 728 .slot = data->table->add_freq, | |
| 729 }; | |
| 730 if(ioctl(data->tfd, SET_CHANNEL, &freq) < 0) { | |
| 731 fprintf(stderr, "Cannot tune to the specified channel\n"); | |
| 732 data->ch = 0; | |
| 733 break; | |
| 734 } | |
| 735 data->ch = atoi(new_tp); | |
| 736 calc_cn(data->tfd, data->table->type); | |
| 737 } | |
| 738 if(ioctl(data->tfd, START_REC, 0) < 0) { | |
| 739 // $B$3$3$N07$$$I$3$m$,LB$&$H$3$m!#(Bexit $B$7$F$b$$$$5$$,$9$k(B | |
| 740 fprintf(stderr, "Tuner cannot start recording\n"); | |
| 741 break; | |
| 742 } | |
| 743 time(&split_start_time); | |
| 744 } | 729 } |
| 745 if ( old_sid != new_sid ) { | 730 |
| 746 old_sid = new_sid; | 731 mbuf.mtype = 1; |
| 747 split_shutdown(splitter); | 732 snprintf(mbuf.mtext, sizeof(mbuf.mtext), |
| 748 splitter = split_startup(ut->sid, NULL, NULL); | 733 "ch=%s t=%d e=%d i=%s", |
| 749 if ( splitter == NULL ) { | 734 ut->tp, 0, 0, ut->sid); |
| 750 fprintf (stderr, "reader_func() splitter RESTART FAILED.\n"); | 735 if (msgsnd(msqid, &mbuf, strlen(mbuf.mtext)+1, IPC_NOWAIT) < 0) { |
| 751 use_splitter = FALSE; | 736 // $B%(%i!<;~$O%A%c%s%M%kJQ99%j%/%(%9%H$O$J$+$C$?$3$H$K$9$k(B |
| 737 // $B$J$`$J$`(B | |
| 738 fprintf(stderr, "msgsend error.\n"); | |
| 739 ut->tp = data->ch; | |
| 740 ut->sid = data->sid_list; | |
| 741 free(qbuf); | |
| 742 qbuf = NULL; | |
| 743 continue; | |
| 752 } | 744 } |
| 753 split_select_finish = TSS_ERROR; | |
| 754 free(qbuf); | 745 free(qbuf); |
| 755 qbuf = NULL; | 746 qbuf = NULL; |
| 756 | |
| 757 pthread_mutex_lock(&data->stream_queue->mutex); | |
| 758 while(1) { | |
| 759 STREAM_QUEUE_T *p_queue = data->stream_queue; | |
| 760 if (p_queue->num_used == 0) | |
| 761 break; | |
| 762 free(p_queue->buffer[p_queue->out]->data); | |
| 763 p_queue->buffer[p_queue->out]->data = NULL; | |
| 764 free(p_queue->buffer[p_queue->out]); | |
| 765 p_queue->buffer[p_queue->out] = NULL; | |
| 766 p_queue->out++; | |
| 767 p_queue->out %= p_queue->size; | |
| 768 | |
| 769 /* update counters */ | |
| 770 p_queue->num_avail++; | |
| 771 p_queue->num_used--; | |
| 772 } | |
| 773 pthread_mutex_unlock(&data->stream_queue->mutex); | |
| 774 time(&split_start_time); | |
| 775 continue; | 747 continue; |
| 776 } | 748 } |
| 777 } | 749 } |
| 778 do { | 750 do { |
| 779 eqbuf = malloc(sizeof(ARIB_STD_B25_BUFFER)); | 751 eqbuf = malloc(sizeof(ARIB_STD_B25_BUFFER)); |
| 849 buf = dbuf; | 821 buf = dbuf; |
| 850 } | 822 } |
| 851 | 823 |
| 852 if(use_splitter) { | 824 if(use_splitter) { |
| 853 /* $BJ,N%BP>]0J30$r$U$k$$Mn$H$9(B */ | 825 /* $BJ,N%BP>]0J30$r$U$k$$Mn$H$9(B */ |
| 854 code = split_ts(splitter, &buf, &splitbuf); | 826 code = split_ts(data->splitter, &buf, &splitbuf); |
| 855 if(code != TSS_SUCCESS) { | 827 if(code != TSS_SUCCESS) { |
| 856 break; | 828 break; |
| 857 } | 829 } |
| 858 | 830 |
| 859 buf.data = splitbuf.buffer; | 831 buf.data = splitbuf.buffer; |
| 1240 close(tdata->tfd); | 1212 close(tdata->tfd); |
| 1241 fprintf(stderr, "Cannot tune to the specified channel: %s\n", device); | 1213 fprintf(stderr, "Cannot tune to the specified channel: %s\n", device); |
| 1242 return 1; | 1214 return 1; |
| 1243 } | 1215 } |
| 1244 else { | 1216 else { |
| 1245 tdata->ch = atoi(channel); | 1217 strncpy(tdata->ch, channel, sizeof(tdata->ch)); |
| 1246 } | 1218 } |
| 1247 } | 1219 } |
| 1248 else { | 1220 else { |
| 1249 /* case 2: loop around available devices */ | 1221 /* case 2: loop around available devices */ |
| 1250 if(tdata->table->type == CHTYPE_SATELLITE) { | 1222 if(tdata->table->type == CHTYPE_SATELLITE) { |
| 1282 if(tdata->tfd < 0) { | 1254 if(tdata->tfd < 0) { |
| 1283 fprintf(stderr, "Cannot tune to the specified channel\n"); | 1255 fprintf(stderr, "Cannot tune to the specified channel\n"); |
| 1284 return 1; | 1256 return 1; |
| 1285 } | 1257 } |
| 1286 else { | 1258 else { |
| 1287 tdata->ch = atoi(channel); | 1259 strncpy(tdata->ch, channel, sizeof(tdata->ch)); |
| 1288 } | 1260 } |
| 1289 } | 1261 } |
| 1290 | 1262 |
| 1291 /* show signal strength */ | 1263 /* show signal strength */ |
| 1292 calc_cn(tdata->tfd, tdata->table->type); | 1264 calc_cn(tdata->tfd, tdata->table->type); |
| 1599 splitter = split_startup(sid_list, es_name_prefix, start_time); | 1571 splitter = split_startup(sid_list, es_name_prefix, start_time); |
| 1600 if(splitter->sid_list == NULL) { | 1572 if(splitter->sid_list == NULL) { |
| 1601 fprintf(stderr, "Cannot start TS splitter\n"); | 1573 fprintf(stderr, "Cannot start TS splitter\n"); |
| 1602 return 1; | 1574 return 1; |
| 1603 } | 1575 } |
| 1576 strncpy(tdata.sid_list, sid_list, sizeof(tdata.sid_list)); | |
| 1604 } | 1577 } |
| 1605 | 1578 |
| 1606 /* initialize DLNA */ | 1579 /* initialize DLNA */ |
| 1607 if(use_dlna) { | 1580 if(use_dlna) { |
| 1608 do { | 1581 do { |
| 1619 break; | 1592 break; |
| 1620 } | 1593 } |
| 1621 tdata.streamer->stream_nr = 0; | 1594 tdata.streamer->stream_nr = 0; |
| 1622 tdata.streamer->stream_session[0] = NULL; | 1595 tdata.streamer->stream_session[0] = NULL; |
| 1623 pthread_mutex_init(&tdata.streamer->mutex, NULL); | 1596 pthread_mutex_init(&tdata.streamer->mutex, NULL); |
| 1597 pthread_mutex_init(&tdata.splitter_mutex, NULL); | |
| 1624 | 1598 |
| 1625 pthread_create(&stream_thread, NULL, stream_func, &tdata); | 1599 pthread_create(&stream_thread, NULL, stream_func, &tdata); |
| 1626 pthread_create(&dlna_thread, NULL, dlna_startup, NULL); | 1600 pthread_create(&dlna_thread, NULL, dlna_startup, NULL); |
| 1627 } while(0); | 1601 } while(0); |
| 1628 } | 1602 } |
