--- margi2/cvdv.c 2001/04/06 09:03:53 1.13 +++ margi2/cvdv.c 2001/04/25 15:31:08 1.14 @@ -255,12 +255,12 @@ int SetVideoAttr(struct cvdv_cards *card (card, hsize, vsize, ((aspect_ratio) ? 3 : 2), ((video_compression_mode) ? 0 : 1), source_picture_letterboxed, tv_system)) { - printk(KERN_ERR LOGNAME + MDEBUG(0, ": Video Decoder Open failed: On-card memory insufficient for frame stores\n"); } card->lastvattr = vattr; } else { - printk(KERN_ERR LOGNAME + MDEBUG(0, ": Video attribute not set, equal to previous one.\n"); } return 0; @@ -310,7 +310,7 @@ int SetAudioAttr(struct cvdv_cards *card AudioInit(card, ((fs) ? 96 : 48), ((audio_application_mode == 2) ? 1 : 0)); } else { - printk(KERN_ERR LOGNAME + MDEBUG(0, ": Audio attribute not set, equal to previous one.\n"); } } else { @@ -345,7 +345,7 @@ int Prepare(struct cvdv_cards *card) switch (setup->streamtype) { default: case stream_none: // unknown stream! - printk(KERN_ERR LOGNAME + MDEBUG(0, ": Video Decoder Prepare failed: unknown stream type\n"); return -ENODEV; // not an MPEG stream! case stream_ES: // Elementary Stream @@ -362,7 +362,7 @@ int Prepare(struct cvdv_cards *card) break; } if (err) { // insufficient memory - printk(KERN_ERR LOGNAME + MDEBUG(0, ": Video Decoder Prepare failed: no kernel memory, please reboot if possible\n"); CloseCard(card); return -ENODEV; @@ -388,7 +388,7 @@ int Prepare(struct cvdv_cards *card) card->stream.sh.aspectratio, !card->stream.MPEG2, 0, (card->stream.hsize > 480)))) { // TODO: include vbvbuffersize - printk(KERN_ERR LOGNAME + MDEBUG(0, ": Video Decoder Open failed: %s\n", ((err == 1) ? "Picture size too big (>1440 pixel wide)" : @@ -396,7 +396,7 @@ int Prepare(struct cvdv_cards *card) CloseCard(card); return -ENODEV; // picture too big or insufficient memory } - printk(KERN_DEBUG LOGNAME ": Ready to go\n"); + MDEBUG(1, ": Ready to go\n"); card->startingV = 1; // tell the card to start playing as soon as ES-buffers are sufficiently full card->startingA = 1; // tell the card to start playing as soon as ES-buffers are sufficiently full } @@ -411,7 +411,7 @@ int SetSCRstart(struct cvdv_cards *card, uint32_t SCR_compareA; uint32_t SCR_compareV; if (card->startingV) { - printk(KERN_ERR LOGNAME ": SCR in DVD Pack: 0x%08X\n", + MDEBUG(0, ": SCR in DVD Pack: 0x%08X\n", SCR_base); card->startingV = 0; card->startingA = 0; @@ -427,7 +427,7 @@ int SetSCRstart(struct cvdv_cards *card, DecoderWriteByte(card, 0x00B, (SCR_base >> 16) & 0xFF); DecoderWriteByte(card, 0x00C, (SCR_base >> 24) & 0xFF); DecoderMaskByte(card, 0x011, 0x03, 0x02); // compare, not capture - printk(KERN_ERR LOGNAME ": SCR compare value: 0x%08X\n", + MDEBUG(0, ": SCR compare value: 0x%08X\n", SCR_compare); //DecoderWriteDWord(card,0x00D,SCR_compare); // Set Compare register DecoderWriteByte(card, 0x00D, SCR_compare & 0xFF); // Set Compare register @@ -470,8 +470,7 @@ int SetSCRstart(struct cvdv_cards *card, SCR_compareV | ((uint32_t) DecoderReadByte(card, 0x010) << 24); if (DecoderReadByte(card, 0x013) & 0x03) - printk(KERN_DEBUG LOGNAME - ": SCR 0x%08X, videocmp=0x%08X, audiocmp=0x%08X %02X\n", + MDEBUG(1,": SCR 0x%08X, videocmp=0x%08X, audiocmp=0x%08X %02X\n", SCR_base, SCR_compareV, SCR_compareA, DecoderReadByte(card, 0x013)); DecoderMaskByte(card, 0x007, 0xD2, 0xC2); // Del 0x010, SCR counter run @@ -493,8 +492,8 @@ int DecoderWriteBlock(struct cvdv_cards if (size > 0) { - if (!card->use_ring) - MargiSetBuffers(card, NBBUF* 128 * + if (!card->use_ringA) + MargiSetABuffers(card, NBBUF* 128 * CHANNELBUFFERSIZE); if (card->startingDVDV || card->startingDVDA) @@ -511,14 +510,13 @@ int DecoderWriteBlock(struct cvdv_cards SetSCR(card, SCR_base); } card->DMAABusy = 0; - while (((res = MargiPush(card, size, data)) < size) + while (((res = MargiPushA(card, size, data)) < size) && co < 1000) { data+=res; size-=res; co++; - // printk(KERN_DEBUG LOGNAME - // ": DecoderWriteBlock - buffers only filled with %d instead of %d bytes\n", - // res, size); + MDEBUG(2, + ": DecoderWriteBlock - buffers only filled with %d instead of %d bytes\n",res, size); if (card->DMAABusy){ interruptible_sleep_on(&card->wqA); } @@ -553,7 +551,6 @@ static long margi_write(struct cvdv_card struct StreamSetup *setup = &card->setup; int res; - int channel=0; long int out=0; int wc = 0; @@ -565,38 +562,70 @@ static long margi_write(struct cvdv_card return res; if ((setup->streamtype != stream_ES) - && (setup->streamtype != stream_PES)) - channel = 0; - - switch (channel) { - case 0: - if (!card->use_ring) - MargiSetBuffers(card, NBBUF* + && (setup->streamtype != stream_PES)){ + if (!card->use_ringA) + MargiSetABuffers(card, NBBUF* CHANNELBUFFERSIZE); while (wc < 100 && !card->nonblock && out < count){ wc++; - out += MargiPush(card, count, data); + out += MargiPushA(card, count, data); if (out < count){ interruptible_sleep_on(&card->wqA); } } if (card->nonblock) { - out = MargiPush(card, count, data); + out = MargiPushA(card, count, data); } - break; + } + } + return out; + } else { + MDEBUG(0, + ": Video Decoder Prepare failed: device with this minor number not found\n"); + return -ENODEV; // device with this minor number not found + } +} +static long margi_write_audio(struct cvdv_cards *card, const char *data, + unsigned long count, int nonblock) +{ + struct StreamSetup *setup = &card->setup; - case 1: + int res; + long int out=0; + int wc = 0; -// todo - break; + card->nonblock = nonblock; + + if (card != NULL) { + if (count > 0) { // Do we have data? + if ((res = Prepare(card))) + return res; + + if ((setup->streamtype == stream_ES) + && (setup->streamtype == stream_PES)){ + if (!card->use_ringB) + MargiSetBBuffers(card, NBBUF* + CHANNELBUFFERSIZE); + + while (wc < 100 && + !card->nonblock && out < count){ + wc++; + out += MargiPushB(card, count, data); + if (out < count){ + interruptible_sleep_on(&card->wqB); + } + } + if (card->nonblock) { + out = MargiPushB(card, count, data); + } } } return out; } else { - printk(KERN_ERR LOGNAME + MDEBUG(0, ": Video Decoder Prepare failed: device with this minor number not found\n"); return -ENODEV; // device with this minor number not found } @@ -605,15 +634,8 @@ static long margi_write(struct cvdv_card void pes_write(uint8_t *buf, int count, void *priv) { struct cvdv_cards *card = (struct cvdv_cards *) priv; - int out; - - out = margi_write(card, buf, count, 0); -#if 0 - if (out != count) - printk(KERN_ERR LOGNAME ": Yikes\n"); - printk(KERN_ERR LOGNAME " l: 0x%X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n" , count, - buf[0],buf[1],buf[2],buf[3],buf[4],buf[5]); -#endif + + margi_write(card, buf, count, 0); } @@ -633,9 +655,11 @@ static unsigned int PSpoll(struct file * minorlist[MINOR(file->f_dentry->d_inode->i_rdev) % MAXDEV]; // minor number modulo 16 if (card != NULL) { poll_wait(file, &card->wqA , table); - if ( ring_write_rest(&(card->rbuf)) ) - return POLLOUT | POLLWRNORM; - else return 0; + if ( !card->rbufA.buffy || ring_write_rest(&(card->rbufA)) ) + return (POLLOUT | POLLWRNORM); + else { + return 0; + } } else return POLLERR; } @@ -646,8 +670,7 @@ OSD_DrawCommand(struct cvdv_cards *card, switch (dc->cmd) { case OSD_Close: - printk(KERN_DEBUG LOGNAME - ": OSD Close\n"); + MDEBUG(1,": OSD Close\n"); return OSDClose(card); case OSD_Open: // Open(x0,y0,x1,y1,BitPerPixel(2/4/8),mix(0..15)) return OSDOpen(card, dc->x0, @@ -751,8 +774,7 @@ static int PSioctl(struct inode *inode, break; case Decoder_Set_Videosystem: - printk(KERN_DEBUG LOGNAME - ": -- Decoder_Set_Videosystem\n"); + MDEBUG(1,": -- Decoder_Set_Videosystem\n"); card->videomode = (videosystem) command->param1; SetVideoSystem(card); @@ -760,16 +782,14 @@ static int PSioctl(struct inode *inode, break; case Decoder_Set_Streamtype: - printk(KERN_DEBUG LOGNAME - ": -- Decoder_Set_Streamtype\n"); + MDEBUG(1,": -- Decoder_Set_Streamtype\n"); card->setup.streamtype = (stream_type) command->param1; return 0; break; case Decoder_Set_Audiotype: - printk(KERN_DEBUG LOGNAME - ": -- Decoder_Set_Audiotype\n"); + MDEBUG(1,": -- Decoder_Set_Audiotype\n"); card->setup.audioselect = (audio_type) command->param1; DecoderPrepareAudio(card); @@ -777,8 +797,7 @@ static int PSioctl(struct inode *inode, break; case Decoder_Set_VideoStreamID: - printk(KERN_DEBUG LOGNAME - ": -- Decoder_Set_VideoStreamID\n"); + MDEBUG(1,": -- Decoder_Set_VideoStreamID\n"); card->setup.videoID = command->param1; DecoderPrepareVideo(card); @@ -786,8 +805,8 @@ static int PSioctl(struct inode *inode, break; case Decoder_Set_AudioStreamID: - printk(KERN_DEBUG LOGNAME - ": -- Decoder_Set_AudioStreamID 0x%02X 0x%02X\n",command->param1,command->param2); + MDEBUG(1,": -- Decoder_Set_AudioStreamID 0x%02X 0x%02X\n", + command->param1,command->param2); card->setup.audioID = command->param1; card->setup.audioIDext = @@ -900,8 +919,7 @@ static int PSioctl(struct inode *inode, command-> param3); case Decoder_Set_Videoattribute: - printk(KERN_DEBUG LOGNAME - ": -- Decoder_Set_Videoattribute\n"); + MDEBUG(1,": -- Decoder_Set_Videoattribute\n"); if (!card->ChannelBuffersAllocated) { DecoderStreamReset(card); MargiFlush(card); @@ -921,8 +939,7 @@ static int PSioctl(struct inode *inode, // tell the card to start playing as soon as ES-buffers are sufficiently full return 0; case Decoder_Set_Audioattribute: - printk(KERN_DEBUG LOGNAME - ": -- Decoder_Set_Audioattribute\n"); + MDEBUG(1,": -- Decoder_Set_Audioattribute\n"); SetAudioAttr(card, command->param1); card->startingDVDA = @@ -948,7 +965,7 @@ static int PSioctl(struct inode *inode, } else return -EINVAL; } else { - printk(KERN_ERR LOGNAME + MDEBUG(0, ": Video Decoder Prepare failed: device with this minor number not found\n"); return -ENODEV; // device with this minor number not found } @@ -966,7 +983,7 @@ static int margi_open(struct cvdv_cards { int closed; if (card != NULL) { - printk(KERN_DEBUG LOGNAME ": -- open \n"); + MDEBUG(1, ": -- open \n"); CloseCard(card); OSDClose(card); #ifdef NOINT @@ -977,8 +994,7 @@ static int margi_open(struct cvdv_cards #endif if (card->open) - printk(KERN_DEBUG LOGNAME - ": PSopen - already open\n"); + MDEBUG(0,": PSopen - already open\n"); closed = 1; if (card->open) closed = 0; @@ -990,7 +1006,7 @@ static int margi_open(struct cvdv_cards MOD_INC_USE_COUNT; return 0; } else { - printk(KERN_ERR LOGNAME + MDEBUG(0, ": Video Decoder Prepare failed: device with this minor number not found\n"); return -ENODEV; // device with this minor number not found } @@ -1009,22 +1025,19 @@ static int all_margi_close(struct cvdv_ { if (card != NULL) { - printk(KERN_DEBUG LOGNAME ": -- PSrelease\n"); + MDEBUG(1, ": -- PSrelease\n"); if (card->open <= 0) - printk(KERN_DEBUG LOGNAME - ": PSrelease - not open\n"); + MDEBUG(1,": PSrelease - not open\n"); card->open--; MOD_DEC_USE_COUNT; if (!card->open) { - printk(KERN_DEBUG LOGNAME - ": PSrelease - last close\n"); + MDEBUG(1,": PSrelease - last close\n"); CloseCard(card); // close immediately } return 0; } else { - printk(KERN_ERR LOGNAME - ": Video Decoder Prepare failed: device with this minor number not found\n"); + MDEBUG(0,": Video Decoder Prepare failed:\n"); return -ENODEV; // device with this minor number not found } @@ -1072,6 +1085,7 @@ dvbdev_open(struct dvb_device *dvbdev, i struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv; int type=num2type(card, num); int ret=0; + struct StreamSetup *setup = &card->setup; if (type<0) return -EINVAL; @@ -1101,6 +1115,8 @@ dvbdev_open(struct dvb_device *dvbdev, i ret=DmxDevFilterAlloc(&card->dmxdev, file); break; case DVB_DEVICE_DVR_0: + setup->streamtype = stream_PES; + setup->audioselect = audio_MPEG; margi_open(card, 0); ret=DmxDevDVROpen(&card->dmxdev, file); break; @@ -1177,6 +1193,11 @@ dvbdev_write(struct dvb_device *dvbdev, case DVB_DEVICE_AUDIO_0: if (card->audiostate.streamSource!=AUDIO_SOURCE_MEMORY) return -EPERM; + if ( card->setup.streamtype != stream_PES ) + return -EPERM; + +// return margi_write_audio(card, buf, count, +// file->f_flags&O_NONBLOCK); return count; case DVB_DEVICE_DVR_0: @@ -1345,11 +1366,35 @@ dvbdev_ioctl(struct dvb_device *dvbdev, return -EFAULT; break; } + case VIDEO_SET_STREAMTYPE: + { + int f = -1; + switch(arg){ + case VIDEO_CAP_MPEG1: + case VIDEO_CAP_MPEG2: + f = stream_PES; + break; + + case VIDEO_CAP_SYS: + case VIDEO_CAP_PROG: + f = stream_PS; + break; + + case VIDEO_CAP_SPU: + case VIDEO_CAP_NAVI: + case VIDEO_CAP_CSS: + f = stream_DVD; + } + + card->setup.streamtype = f; + } + break; + default: return -ENOIOCTLCMD; } return 0; - + case DVB_DEVICE_AUDIO_0: if (((file->f_flags&O_ACCMODE)==O_RDONLY) && (cmd!=AUDIO_GET_STATUS)) @@ -1384,7 +1429,8 @@ dvbdev_ioctl(struct dvb_device *dvbdev, break; case AUDIO_SELECT_SOURCE: - card->audiostate.streamSource=(audioStreamSource_t) arg; + card->audiostate.streamSource= + (audioStreamSource_t) arg; break; case AUDIO_SET_MUTE: @@ -1436,13 +1482,46 @@ dvbdev_ioctl(struct dvb_device *dvbdev, if (copy_to_user(parg, &cap, sizeof(cap))) return -EFAULT; - break; } - default: - return -ENOIOCTLCMD; + break; + + + case AUDIO_SET_STREAMTYPE: + { + int f = -1; + + switch(arg){ + case AUDIO_CAP_DTS: + case AUDIO_CAP_MP3: + case AUDIO_CAP_AAC: + case AUDIO_CAP_SDDS: + case AUDIO_CAP_OGG: + f = audio_none; + break; + + case AUDIO_CAP_LPCM: + f = audio_LPCM; + break; + + case AUDIO_CAP_MP1: + case AUDIO_CAP_MP2: + f = audio_MPEG; + break; + + case AUDIO_CAP_AC3: + f = audio_AC3; + break; + } + + card->setup.audioselect = (audio_type) f; + DecoderPrepareAudio(card); } break; - + + default: + return -ENOIOCTLCMD; + } + break; case DVB_DEVICE_DEMUX_0: return DmxDevIoctl(&card->dmxdev, file, cmd, arg); @@ -1486,7 +1565,7 @@ dvbdev_poll(struct dvb_device *dvbdev, i return PSpoll(file, wait); case DVB_DEVICE_AUDIO_0: - return PSpoll(file, wait); + return POLLOUT;//PSpoll(file, wait); case DVB_DEVICE_CA_0: break; @@ -1602,8 +1681,8 @@ dvb_stop_feed(dvb_demux_feed_t *dvbdmxfe if ((dvbdmxfeed->ts_type & TS_DECODER) && (dvbdmxfeed->pes_type<=1)) { if (dvbdmx->playing) { - free_p2p(&card->tsa); - free_p2p(&card->tsv); + free_ipack(&card->tsa); + free_ipack(&card->tsv); DecoderPause(card); dvbdmx->playing=0; } @@ -1632,7 +1711,7 @@ dvb_write_to_decoder(dvb_demux_feed_t *d struct cvdv_cards * card = (struct cvdv_cards *)dvbdmx->priv; uint16_t pid = 0; - p2p *p; + ipack *p; if (!card) return -EINVAL;