diff -r 071fb4e338da Makefile --- a/Makefile Mon Nov 05 00:28:22 2007 +0100 +++ b/Makefile Fri Nov 09 15:29:52 2007 +0100 @@ -13,9 +13,14 @@ obj-$(CONFIG_VIDEO_EM28XX_AUDIO) += em28 obj-$(CONFIG_VIDEO_EM28XX_AUDIO) += em28xx-audio.o obj-$(CONFIG_DVB_EM2880) += em28xx-dvb.o -EXTRA_CFLAGS += -Idrivers/media/video -Idrivers/media/dvb/frontends -Idrivers/media/dvb/dvb-core -Idrivers/media/tuners/ -Iinclude/linux -DCONFIG_DVB_TUNER_STUB -DCONFIG_DVB_DEMOD_STUB -Wall +SDIR := /lib/modules/$(shell uname -r)/source + + +EXTRA_CFLAGS += -I$(SDIR)/drivers/media/video -I$(SDIR)/drivers/media/dvb/frontends -I$(SDIR)/drivers/media/dvb/dvb-core -I$(SDIR)/drivers/media/tuners/ -Iinclude/linux -Idrivers/media/video -Idrivers/media/dvb/frontends -Idrivers/media/dvb/dvb-core -Idrivers/media/tuners/ -Iinclude/linux -DCONFIG_DVB_TUNER_STUB -DCONFIG_DVB_DEMOD_STUB -Wall KDIR := /lib/modules/$(shell uname -r)/build + + PWD := $(shell pwd) default: diff -r 071fb4e338da em28xx-audio.c --- a/em28xx-audio.c Mon Nov 05 00:28:22 2007 +0100 +++ b/em28xx-audio.c Mon Nov 05 05:26:53 2007 +0100 @@ -75,18 +75,22 @@ static snd_pcm_hardware_t snd_em28xx_hw_ #else static struct snd_pcm_hardware snd_em28xx_hw_capture = { #endif - .info = SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_MMAP_VALID, + .info = SNDRV_PCM_INFO_BLOCK_TRANSFER | + SNDRV_PCM_INFO_MMAP | + SNDRV_PCM_INFO_BATCH | + SNDRV_PCM_INFO_INTERLEAVED | + SNDRV_PCM_INFO_MMAP_VALID, .formats = SNDRV_PCM_FMTBIT_S16_LE, .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_KNOT, .rate_min = 48000, .rate_max = 48000, .channels_min = 2, .channels_max = 2, - .buffer_bytes_max = 62720*8, /* just about the value in usbaudio.c */ - .period_bytes_min = 64, //12544/2, - .period_bytes_max = 12544, + .buffer_bytes_max = 1024*1024, //62720*8, /* just about the value in usbaudio.c */ + .period_bytes_min = 64, //64, //12544/2, + .period_bytes_max = 512*1024, //6272, //12544, .periods_min = 2, - .periods_max = 98, //12544, + .periods_max = 1024, //12544, }; #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16) @@ -109,6 +113,7 @@ static int snd_em28xx_capture_open(struc case TUNER_STUB_DVBT_TV: case TUNER_STUB_ATSC_TV: /* digital has no support for analog audio */ + ret = dev->em28xx_acquire(dev, EM28XX_RADIO, 1); if (ret != 0 ) { printk("device is already in use by DVB-T\n"); return -EINVAL; @@ -122,7 +127,7 @@ static int snd_em28xx_capture_open(struc tuner.type = V4L2_TUNER_RADIO; /* enable GPIO for analog TV */ - dev->em28xx_gpio_control(dev, EM28XX_MODE, (void*)mode); + dev->em28xx_gpio_control(dev, EM28XX_MODE, &mode); dev->mode = mode; /* upload firmware */ vtype = mode; @@ -136,7 +141,6 @@ static int snd_em28xx_capture_open(struc em28xx_i2c_call_clients(dev, VIDIOC_S_TUNER, &tuner); dev->em28xx_write_regs(dev, 0x0f, "\x87", 1); - ret = dev->em28xx_acquire(dev, EM28XX_RADIO, 1); em28xx_i2c_call_clients(dev, VIDIOC_INT_RESET, 0); /* TODO switch to FM mode */ @@ -149,16 +153,19 @@ static int snd_em28xx_capture_open(struc case TUNER_STUB_ANALOG_TV: printk("em28xx-audio: device is currently in analog TV mode\n"); /* unmute by default */ + ret = dev->em28xx_acquire(dev, EM28XX_VIDEO, 1); + if (ret!=0) + return -EBUSY; dev->em28xx_write_regs(dev, 0x0f, "\x87", 1); break; case TUNER_STUB_RADIO: /* check current mode and put a hard lock onto it */ printk("em28xx-audio: device is currently in analogue FM mode\n"); /* unmute by default here */ - dev->em28xx_write_regs(dev, 0x0f, "\x87", 1); ret = dev->em28xx_acquire(dev, EM28XX_RADIO, 1); if ( ret == 0 ) printk("device is locked in fmradio mode now\n"); + dev->em28xx_write_regs(dev, 0x0f, "\x87", 1); break; default: printk("em28xx-audio: unhandled mode %d\n", dev->mode); @@ -298,10 +305,15 @@ static void em28xx_audio_isocirq(struct stride = runtime->frame_bits >> 3; for(i=0;inumber_of_packets;i++){ + int length=urb->iso_frame_desc[i].actual_length/stride; cp=(unsigned char *) urb->transfer_buffer + urb->iso_frame_desc[i].offset; if(!length) + continue; + + + if (urb->iso_frame_desc[i].status) continue; spin_lock_irqsave(&dev->adev->slock, flags); @@ -317,8 +329,8 @@ static void em28xx_audio_isocirq(struct } spin_unlock_irqrestore(&dev->adev->slock, flags); - if(oldptr + length >= runtime->buffer_size){ - unsigned int cnt = runtime->buffer_size-oldptr-1; + if(oldptr + length > runtime->buffer_size){ + unsigned int cnt = runtime->buffer_size-oldptr; memcpy(runtime->dma_area+oldptr*stride, cp , cnt*stride); memcpy(runtime->dma_area, cp + cnt, length*stride - cnt*stride); } else { diff -r 071fb4e338da em28xx-video.c --- a/em28xx-video.c Mon Nov 05 00:28:22 2007 +0100 +++ b/em28xx-video.c Fri Nov 09 15:19:52 2007 +0100 @@ -271,8 +271,6 @@ static void request_modules(struct em28x */ int em28xx_config(struct em28xx *dev) { - -#if 0 em28xx_audio_usb_mute(dev, EM28XX_MUTED); dev->mute = 1; /* maybe not the right place... */ dev->volume = 0x1f; @@ -282,7 +280,6 @@ int em28xx_config(struct em28xx *dev) em28xx_colorlevels_set_default(dev); em28xx_compression_disable(dev); -#endif return 0; } @@ -409,8 +406,6 @@ static void video_mux(struct em28xx *dev static int em28xx_acquire(struct em28xx *dev, int mode, int lock) { int ret = 0; - printk("LOCK REQUEST: %d\n",lock); - printk("LOCK DBG:\nRADIO: %d\nVIDEO: %d\nVBI: %d\nDVBT: %d\n",dev->radio_user, dev->video_user, dev->vbi_user, dev->fe_user); switch(mode) { /* radio is allowed if TV and DVB is not in use */ case EM28XX_RADIO: @@ -426,9 +421,7 @@ static int em28xx_acquire(struct em28xx break; /* video, vbi and analogue audio are allowed at the same time */ case EM28XX_VIDEO: - printk("trying to acquire videolock\n"); if (lock) { - printk("LOCK == 1\n"); if (dev->fe_user>0 || dev->radio_user>0) { printk("ret will be ebusy!\n"); ret = -EBUSY; @@ -451,7 +444,6 @@ static int em28xx_acquire(struct em28xx } break; case EM28XX_DVBT: - /* dvb only works in single mode */ if (lock) { if (dev->radio_user || dev->video_user || dev->vbi_user) { ret = -EBUSY; @@ -466,7 +458,6 @@ static int em28xx_acquire(struct em28xx ret = -EINVAL; } - printk("lock attempt: %d\n",ret); return ret; } @@ -539,7 +530,7 @@ static int em28xx_v4l2_open(struct inode em28xx_config_i2c(dev); /* this is moreover to switch the decoder to FM */ -// em28xx_i2c_call_clients(dev, VIDIOC_S_TUNER, &config_tuner); + em28xx_i2c_call_clients(dev, VIDIOC_S_TUNER, &config_tuner); } } @@ -601,7 +592,6 @@ static int em28xx_v4l2_open(struct inode dev->state |= DEV_INITIALIZED; dev->state &= ~DEV_MISCONFIGURED; } - printk("em28xx-video.c: opened\n"); err: up_read(&em28xx_disconnect); return errCode; @@ -667,10 +657,7 @@ static int em28xx_v4l2_close(struct inod dev->vbi_reader=0; } - printk("releasing lock for video\n"); dev->em28xx_acquire(dev, fh->type, 0); - - printk("released lock for video\n"); /* assume that all handles are closed */ if(dev->users==1){ @@ -1330,7 +1317,6 @@ static int em28xx_set_fmt(struct em28xx if (format->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) { em28xx_i2c_call_clients(dev,VIDIOC_G_FMT,format); - printk("sliced vbi capture!!!\n"); if (format->fmt.sliced.service_set==0) return -EINVAL; @@ -1351,7 +1337,6 @@ static int em28xx_set_fmt(struct em28xx } if (format->type != V4L2_BUF_TYPE_VIDEO_CAPTURE){ - printk("em28xx-video.c: %s !V4L_BUF_TYPE_VIDEO_CAPTURE\n",__FUNCTION__); return -EINVAL; } @@ -1420,7 +1405,6 @@ static int em28xx_set_fmt(struct em28xx for (i = 0; i < dev->num_frames; i++) if (dev->frame[i].vma_use_count) { - printk("numframes !! EINVAL!!!\n"); em28xx_videodbg("VIDIOC_S_FMT failed. " "Unmap the buffers first.\n"); return -EINVAL; @@ -1787,25 +1771,20 @@ static int em28xx_do_ioctl(struct inode struct v4l2_frequency *f = arg; if (0 != f->tuner){ - printk("VIDIOC_S_FREQUENCY: (arg)->tuner != 0\n"); return -EINVAL; } switch(fh->type) { case EM28XX_RADIO: - printk("radio is trying to tune\n"); break; case EM28XX_VIDEO: - printk("video is trying to tune\n"); break; } if ((fh->type == EM28XX_RADIO && f->type != V4L2_TUNER_RADIO) || (fh->type == EM28XX_VIDEO && f->type != V4L2_TUNER_ANALOG_TV)) { - printk("VIDIOC_S_FREQUENCY: (arg)->type != V4L2_TUNER_ANALOG_TV\n"); return -EINVAL; } dev->ctl_freq = f->frequency; - printk("setting frequency(em28xx): %d\n",f->frequency); em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, f); return 0; @@ -2325,9 +2304,7 @@ static int em28xx_init_dev(struct em28xx request_module("media-stub"); /* Do board specific init and eeprom reading */ - printk("card setup %04x!\n",(unsigned int)dev->udev); em28xx_card_setup(dev); - printk("card setup done!\n"); memset(&config, 0x0, sizeof(struct media_config)); config.module_id = tuner_translateid(dev->tuner_type); @@ -2360,7 +2337,6 @@ static int em28xx_init_dev(struct em28xx config.config = 0; config.addr = 0x88>>1; config.mode = TUNER_STUB_ANALOG_TV; - printk("trying to attach cx25843\n"); // dev->em28xx_gpio_control(dev, EM28XX_RESET2, NULL); tuner_bridge_attach(&dev->i2c_adap, em28xx_gpio_control, dev, &config, &dev->vobj); break; diff -r 071fb4e338da em28xx.h --- a/em28xx.h Mon Nov 05 00:28:22 2007 +0100 +++ b/em28xx.h Mon Nov 05 05:19:13 2007 +0100 @@ -177,7 +177,7 @@ /* number of buffers for isoc transfers */ #define EM28XX_NUM_BUFS 5 #define EM2880_DVB_NUM_BUFS 5 -#define EM28XX_AUDIO_BUFS 5 +#define EM28XX_AUDIO_BUFS 3 #define EM28XX_NUM_AUDIO_PACKETS 64 #define EM28XX_AUDIO_MAX_PACKET_SIZE 196 /* static value */