Added fixup for channel setup ioctl (mmap channel address)

This commit is contained in:
Jaroslav Kysela 2000-08-31 11:59:43 +00:00
parent 5e06d14431
commit a01c8f0d03

View file

@ -33,6 +33,7 @@ typedef struct {
snd_pcm_t *handle; snd_pcm_t *handle;
int fd; int fd;
int card, device, subdevice; int card, device, subdevice;
void *mmap_data_ptr;
} snd_pcm_hw_t; } snd_pcm_hw_t;
#define SND_FILE_PCM_STREAM_PLAYBACK "/dev/snd/pcmC%iD%ip" #define SND_FILE_PCM_STREAM_PLAYBACK "/dev/snd/pcmC%iD%ip"
@ -127,6 +128,7 @@ static int snd_pcm_hw_channel_setup(void *private, snd_pcm_channel_setup_t * set
int fd = hw->fd; int fd = hw->fd;
if (ioctl(fd, SND_PCM_IOCTL_CHANNEL_SETUP, setup) < 0) if (ioctl(fd, SND_PCM_IOCTL_CHANNEL_SETUP, setup) < 0)
return -errno; return -errno;
setup->area.addr = (char *)hw->mmap_data_ptr + (long)setup->area.addr;
return 0; return 0;
} }
@ -324,7 +326,7 @@ static int snd_pcm_hw_mmap_data(void *private, void **buffer, size_t bsize)
hw->fd, SND_PCM_MMAP_OFFSET_DATA); hw->fd, SND_PCM_MMAP_OFFSET_DATA);
if (ptr == MAP_FAILED || ptr == NULL) if (ptr == MAP_FAILED || ptr == NULL)
return -errno; return -errno;
*buffer = ptr; *buffer = hw->mmap_data_ptr = daddr;
return 0; return 0;
} }
@ -342,10 +344,12 @@ static int snd_pcm_hw_munmap_control(void *private ATTRIBUTE_UNUSED, snd_pcm_mma
return 0; return 0;
} }
static int snd_pcm_hw_munmap_data(void *private ATTRIBUTE_UNUSED, void *buffer, size_t bsize) static int snd_pcm_hw_munmap_data(void *private, void *buffer, size_t bsize)
{ {
snd_pcm_hw_t *hw = (snd_pcm_hw_t*) private;
if (munmap(buffer, bsize) < 0) if (munmap(buffer, bsize) < 0)
return -errno; return -errno;
hw->mmap_data_ptr = NULL;
return 0; return 0;
} }