Diff for /margi2/cvdv.c between versions 1.16 and 1.17

version 1.16, 2001/05/23 14:24:08 version 1.17, 2001/06/01 16:43:07
Line 493  int DecoderWriteBlock(struct cvdv_cards Line 493  int DecoderWriteBlock(struct cvdv_cards
         if (size > 0) {          if (size > 0) {
   
                 if (!card->use_ringA)                  if (!card->use_ringA)
                         MargiSetABuffers(card, NBBUF * CHANNELBUFFERSIZE);                          MargiSetBuffers(card, NBBUF*CHANNELBUFFERSIZE,0);
                                   
                 if (card->startingDVDV || card->startingDVDA)                  if (card->startingDVDV || card->startingDVDA)
                         setSCR = 1;                          setSCR = 1;
Line 547  int DecoderWriteBlock(struct cvdv_cards Line 547  int DecoderWriteBlock(struct cvdv_cards
 static long margi_write(struct cvdv_cards *card, const char *data,  static long margi_write(struct cvdv_cards *card, const char *data,
                       unsigned long count, int nonblock)                        unsigned long count, int nonblock)
 {  {
         struct StreamSetup *setup = &card->setup;  
   
         int res;          int res;
         long int out=0;          long int out=0;
         int wc = 0;          int free;
   
           free = ring_write_rest(&(card->rbufA));
   
         card->nonblock = nonblock;          card->nonblock = nonblock;
   
Line 559  static long margi_write(struct cvdv_card Line 560  static long margi_write(struct cvdv_card
                 if (count > 0) {        // Do we have data?                  if (count > 0) {        // Do we have data?
                         if ((res = Prepare(card)))                          if ((res = Prepare(card)))
                                 return res;                                  return res;
                                                   if (!card->use_ringA)
                         if ((setup->streamtype != stream_ES)                                  MargiSetBuffers(card, NBBUF*CHANNELBUFFERSIZE,
                             && (setup->streamtype != stream_PES)){                                                  0);
                                 if (!card->use_ringA)                          if (!nonblock && 
                                         MargiSetABuffers(card, NBBUF*                              !wait_event_interruptible(card->wqA, 
                                                          CHANNELBUFFERSIZE);                                                        free >count )){
                                                                   out = MargiPushA(card, count,
                                 while (wc < 100 &&                                                   data);
                                        !card->nonblock && out < count){                          } else {
                                         wc++;                                  out = MargiPushA(card, count, data);
                                         out += MargiPushA(card, count, data);  
                                         if (out < count){  
                                                 interruptible_sleep_on(&card->wqA);  
                                         }  
                                 }  
                                 if (card->nonblock) {  
                                         out = MargiPushA(card, count, data);  
                                 }  
                         }                          }
                 }                  }
                 return out;                  return out;
Line 587  static long margi_write(struct cvdv_card Line 580  static long margi_write(struct cvdv_card
         }          }
 }         }       
   
   
 static long margi_write_audio(struct cvdv_cards *card, const char *data,  static long margi_write_audio(struct cvdv_cards *card, const char *data,
                       unsigned long count, int nonblock)                        unsigned long count, int nonblock)
 {  {
Line 594  static long margi_write_audio(struct cvd Line 588  static long margi_write_audio(struct cvd
   
         int res;          int res;
         long int out=0;          long int out=0;
         int wc = 0;          int free;
   
           free = ring_write_rest(&(card->rbufB));
   
         card->nonblock = nonblock;          card->nonblock = nonblock;
   
Line 602  static long margi_write_audio(struct cvd Line 598  static long margi_write_audio(struct cvd
                 if (count > 0) {        // Do we have data?                  if (count > 0) {        // Do we have data?
                         if ((res = Prepare(card)))                          if ((res = Prepare(card)))
                                 return res;                                  return res;
                           
                         if ((setup->streamtype == stream_ES)                          if ((setup->streamtype == stream_ES)
                             && (setup->streamtype == stream_PES)){                              || (setup->streamtype == stream_PES)){
                                 if (!card->use_ringB)                                  if (!card->use_ringB)
                                         MargiSetBBuffers(card, NBBUF*                                          MargiSetBuffers(card, NBBUF*
                                                          CHANNELBUFFERSIZE);                                                           CHANNELBUFFERSIZE,1);
                                                                   if (!nonblock && 
                                 while (wc < 1000 &&                                      !wait_event_interruptible(card->wqB,
                                        !card->nonblock && out < count){                                                                free >count )){
                                         wc++;                                          out = MargiPushB(card, count,
                                         out += MargiPushB(card, count, data);                                                           data);
                                         if (out < count){                                  } else {
                                                 interruptible_sleep_on(&card->wqB);  
                                         }  
                                 }  
                                 if (card->nonblock) {  
                                         out = MargiPushB(card, count, data);                                          out = MargiPushB(card, count, data);
                                 }                                  }
                         }                          }
Line 635  void pes_write(uint8_t *buf, int count, Line 626  void pes_write(uint8_t *buf, int count,
         struct cvdv_cards *card = (struct cvdv_cards *) priv;          struct cvdv_cards *card = (struct cvdv_cards *) priv;
                   
         margi_write(card, buf, count, 0);          margi_write(card, buf, count, 0);
   
 }  }
   
   
Line 644  static ssize_t PSwrite(struct file *file Line 634  static ssize_t PSwrite(struct file *file
 {  {
         struct cvdv_cards *card =          struct cvdv_cards *card =
             minorlist[MINOR(file->f_dentry->d_inode->i_rdev) % MAXDEV]; // minor number modulo 16              minorlist[MINOR(file->f_dentry->d_inode->i_rdev) % MAXDEV]; // minor number modulo 16
         return margi_write(card, data, count, 1);          return margi_write(card, data, count, file->f_flags&O_NONBLOCK);
   
 }  }
   
 static unsigned int PSpoll(struct file *file, poll_table * table)  static unsigned int PSpoll(struct file *file, poll_table * table)
Line 663  static unsigned int PSpoll(struct file * Line 652  static unsigned int PSpoll(struct file *
                 return POLLERR;                  return POLLERR;
 }  }
   
   static unsigned int poll_audio(struct file *file, poll_table * table)
   {
           struct cvdv_cards *card =
               minorlist[MINOR(file->f_dentry->d_inode->i_rdev) % MAXDEV]; // minor number modulo 16
           if (card != NULL) {
                   poll_wait(file, &card->wqB, table);
                   if  (  !card->rbufB.buffy || ring_write_rest(&(card->rbufB)) )
                           return (POLLOUT | POLLWRNORM);  
                   else {
                           return 0;
                   }
           } else
                   return POLLERR;
   }
   
 static int  static int
 OSD_DrawCommand(struct cvdv_cards *card,osd_cmd_t *dc)  OSD_DrawCommand(struct cvdv_cards *card,osd_cmd_t *dc)
 {  {
Line 998  static int margi_open(struct cvdv_cards Line 1002  static int margi_open(struct cvdv_cards
                 if (card->open)                  if (card->open)
                         closed = 0;                          closed = 0;
                 if (closed) {   // first open() for this card?                  if (closed) {   // first open() for this card?
                         MargiFreeBuffers(card);                          MargiFreeBuffers(card,2);
                         VideoSetBackground(card, 1, 0, 0, 0);   // black                          VideoSetBackground(card, 1, 0, 0, 0);   // black
                 }                  }
                 card->open++;                  card->open++;
Line 1017  static int PSopen(struct inode *inode, s Line 1021  static int PSopen(struct inode *inode, s
 {  {
         struct cvdv_cards *card = minorlist[MINOR(inode->i_rdev) % MAXDEV];          struct cvdv_cards *card = minorlist[MINOR(inode->i_rdev) % MAXDEV];
         card->audiostate.AVSyncState=true;          card->audiostate.AVSyncState=true;
         return margi_open(card,0);          return  margi_open(card, file->f_flags);
 }  }
   
   
Line 1085  dvbdev_open(struct dvb_device *dvbdev, i Line 1089  dvbdev_open(struct dvb_device *dvbdev, i
         struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv;          struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv;
         int type=num2type(card, num);          int type=num2type(card, num);
         int ret=0;          int ret=0;
         struct StreamSetup *setup = &card->setup;  
   
         if (type<0)          if (type<0)
                 return -EINVAL;                  return -EINVAL;
Line 1102  dvbdev_open(struct dvb_device *dvbdev, i Line 1105  dvbdev_open(struct dvb_device *dvbdev, i
                 card->video_blank=true;                  card->video_blank=true;
                 card->audiostate.AVSyncState=true;                  card->audiostate.AVSyncState=true;
                 card->videostate.streamSource=VIDEO_SOURCE_DEMUX;                  card->videostate.streamSource=VIDEO_SOURCE_DEMUX;
                 margi_open(card, 0);                  margi_open(card, file->f_flags);
                break;                 break;
   
         case DVB_DEVICE_AUDIO_0:          case DVB_DEVICE_AUDIO_0:
                   card->audiostate.AVSyncState=true;
                 card->audiostate.streamSource=AUDIO_SOURCE_DEMUX;                  card->audiostate.streamSource=AUDIO_SOURCE_DEMUX;
                 break;                  break;
   
Line 1115  dvbdev_open(struct dvb_device *dvbdev, i Line 1119  dvbdev_open(struct dvb_device *dvbdev, i
                 ret=DmxDevFilterAlloc(&card->dmxdev, file);                  ret=DmxDevFilterAlloc(&card->dmxdev, file);
                 break;                  break;
         case DVB_DEVICE_DVR_0:          case DVB_DEVICE_DVR_0:
                 setup->streamtype = stream_PES;                   card->audiostate.AVSyncState=true;
                 setup->audioselect = audio_MPEG;                  margi_open(card, file->f_flags);
                 margi_open(card, 0);  
                 ret=DmxDevDVROpen(&card->dmxdev, file);                  ret=DmxDevDVROpen(&card->dmxdev, file);
                 break;                  break;
                   
Line 1196  dvbdev_write(struct dvb_device *dvbdev, Line 1199  dvbdev_write(struct dvb_device *dvbdev,
                 if ( card->setup.streamtype !=  stream_PES )                  if ( card->setup.streamtype !=  stream_PES )
                         return -EPERM;                          return -EPERM;
   
 //              return margi_write_audio(card, buf, count,                   return margi_write_audio(card, buf, count, 
 //                                       file->f_flags&O_NONBLOCK);                                           file->f_flags&O_NONBLOCK);
                 return count;  
   
         case DVB_DEVICE_DVR_0:          case DVB_DEVICE_DVR_0:
                 return DmxDevDVRWrite(&card->dmxdev, file, buf, count, ppos);                  return DmxDevDVRWrite(&card->dmxdev, file, buf, count, ppos);
Line 1242  dvbdev_ioctl(struct dvb_device *dvbdev, Line 1244  dvbdev_ioctl(struct dvb_device *dvbdev,
         struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv;          struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv;
         void *parg=(void *)arg;          void *parg=(void *)arg;
         int type=num2type(card, num);          int type=num2type(card, num);
           uint16_t attr;
   
         switch (type) {          switch (type) {
         case DVB_DEVICE_VIDEO_0:          case DVB_DEVICE_VIDEO_0:
Line 1385  dvbdev_ioctl(struct dvb_device *dvbdev, Line 1388  dvbdev_ioctl(struct dvb_device *dvbdev,
                         case VIDEO_CAP_CSS:                          case VIDEO_CAP_CSS:
                                 f = stream_DVD;                                  f = stream_DVD;
                         }                             }   
   
                         card->setup.streamtype =  f;                          card->setup.streamtype =  f;
           
                 }                                         }                       
                 break;                  break;
   
                   case VIDEO_SET_ID:
                           card->setup.videoID = arg;
                           DecoderPrepareVideo(card);
                           break;
   
                   case VIDEO_SET_SYSTEM:
                           card->videomode = (videosystem) arg;
                           SetVideoSystem(card);
                           break;
   
                   case VIDEO_SET_HIGHLIGHT:
                   {
                           uint8_t data1[4];
                           uint8_t data2[6];
                           videoHighlight_t vh;
   
                           if(copy_from_user(&vh, parg, sizeof(videoHighlight_t)))
                                   return -EFAULT;
   
                           data1[0] = vh.contrast1;
                           data1[1] = vh.contrast2;
                           data1[2] = vh.color1;
                           data1[3] = vh.color2;
                           data2[0] = vh.ypos & 0xFF;
                           data2[1] = (uint8_t) ((vh.ypos >> 1) & 0xFF);
                           data2[2] = (uint8_t) ((vh.ypos >> 2) & 0xFF);
                           data2[3] = vh.xpos & 0xFF;
                           data2[4] = (uint8_t) ((vh.xpos >> 1) & 0xFF);
                           data2[5] = (uint8_t) ((vh.xpos >> 2) & 0xFF);
                           return DecoderHighlight(card, vh.active, data1, data2);
                           break;
                   }
   
                   case VIDEO_SET_SPU:
                   {
                           videoSPU_t spu;
   
                           if(copy_from_user(&spu, parg, sizeof(videoSPU_t)))
                                   return -EFAULT;
   
                           return DecoderSPUStream(card, spu.streamID, spu.active);
                           break;
                   }
   
                   case VIDEO_SET_SPU_Palette:
                   {
                           videoSPUPalette_t spup;
                           
                           if(copy_from_user(&spup, parg, sizeof(videoSPUPalette_t)))
                                   return -EFAULT;
   
                           return DecoderSPUPalette(card, spup.length, spup.palette);
                           break;
                   }
   
                   case VIDEO_GET_NAVI:
                   {
                           videoNaviPack_t navi;
   
                           navi.length = DecoderGetNavi(card, &(navi.data));
                           if(copy_to_user(parg, &navi, sizeof(videoNaviPack_t)))
                                   return -EFAULT;
                   }
                   break;
   
                   case VIDEO_SET_ATTRIBUTES:
                   {
                           if (!card->ChannelBuffersAllocated) {
                                   DecoderStreamReset(card);
                                   MargiFlush(card);
   
                                   card->setup.streamtype = stream_DVD;
                                   card->setup.videoID = 0;
                                   DecoderPrepareVideo(card);
                                   DecoderPreparePS(card, 0, 0, 2, 2, 3, 1);
                           }
   
                           SetVideoAttr(card, arg);
                           card->startingDVDV = 1; 
                   }
                   break;
   
                 default:                  default:
                         return -ENOIOCTLCMD;                          return -ENOIOCTLCMD;
                 }                  }
Line 1515  dvbdev_ioctl(struct dvb_device *dvbdev, Line 1600  dvbdev_ioctl(struct dvb_device *dvbdev,
                                                   
                         card->setup.audioselect = (audio_type) f;                          card->setup.audioselect = (audio_type) f;
                         DecoderPrepareAudio(card);                          DecoderPrepareAudio(card);
                           break;
                 }                  }
                 break;  
                   case AUDIO_SET_ID:
                           if (arg < 0 || arg >32) arg = 0;
                           card->setup.audioID = arg;
                           arg = 0;
                   case AUDIO_SET_EXT_ID:
                           if (arg < 0 || arg >32) arg = 0;
                           card->setup.audioIDext = arg;
   
                           attr = card->lastaattr;
                           DecoderSelectAudioID(card);
                           card->lastaattr = attr;
                           break;
   
                   case AUDIO_SET_MIXER:
                           return -EINVAL;
                   
                   case AUDIO_SET_ATTRIBUTES:
                           SetAudioAttr(card,arg);
                           card->startingDVDA = ((card->setup.audioselect != audio_none)
                                                 && (card->setup.audioselect != 
                                                     audio_disable));
                           break;
   
                   
                   case AUDIO_SET_KARAOKE:
                   {
                           break;
                   }
   
                 default:                  default:
                         return -ENOIOCTLCMD;                          return -ENOIOCTLCMD;
Line 1565  dvbdev_poll(struct dvb_device *dvbdev, i Line 1679  dvbdev_poll(struct dvb_device *dvbdev, i
                 return PSpoll(file, wait);                  return PSpoll(file, wait);
                                   
         case DVB_DEVICE_AUDIO_0:          case DVB_DEVICE_AUDIO_0:
                 return POLLOUT;//PSpoll(file, wait);                  return poll_audio(file, wait);
   
         case DVB_DEVICE_CA_0:          case DVB_DEVICE_CA_0:
                 break;                  break;

Removed from v.1.16  
changed lines
  Added in v.1.17


LinuxTV legacy CVS <linuxtv.org/cvs>