Results 1 to 1 of 1
Hi all,
I want a virtual sound driver that shall be used by the system for audio playback and capture. This driver shall read from a buffer and write to ...
- 07-26-2011 #1Just Joined!
- Join Date
- Jul 2011
- Posts
- 1
How to create a virtual sound driver
Hi all,
I want a virtual sound driver that shall be used by the system for audio playback and capture. This driver shall read from a buffer and write to another buffer. So I have written the following very simple kernel module
insmoding the module creates a driver as /dev/dsp1. And I can read from and write to the device using cat and echo command.Code:#include <linux/module.h> #include <linux/kernel.h> #include <linux/sound.h> #include <linux/sysctl.h> #include <linux/device.h> #include <linux/slab.h> /* kmalloc() */ #include <linux/gfp.h> #include <asm/uaccess.h> /* copy_from/to_user */ #include <linux/major.h> #include <linux/fs.h> #include <linux/pci.h> #include <linux/err.h> #include <sound/core.h> static char* mod_name = "prosip"; MODULE_LICENSE("GPL"); MODULE_VERSION("0.0.1111"); MODULE_AUTHOR("Khaled Mahmood"); MODULE_DESCRIPTION("proSip Virtual Sound Card"); // static int ver_major = 133; static int ver_minor = 3; // static int buffer_size = 0; static char* buffer; static int read_count = 0; /* Declaration of memory.c functions */ int prosip_open(struct inode *inode, struct file *filp); int prosip_release(struct inode *inode, struct file *filp); // ssize_t prosip_read(struct file *filp, char *buf, size_t count, loff_t *f_pos); ssize_t prosip_write(struct file *filp, const char *buf, size_t count, loff_t *f_pos); // int prosip_ioctl(struct inode *inode,struct file *file,unsigned int ioctl_num,unsigned long ioctl_param); // static int __init prosip_init(void); static void __exit prosip_exit(void); /* Structure that declares the usual file access functions */ struct file_operations sound_fops = { owner: THIS_MODULE, read: prosip_read, write: prosip_write, open: prosip_open, release: prosip_release, ioctl: prosip_ioctl }; /* Declaration of the init and exit functions */ module_init(prosip_init); module_exit(prosip_exit); static int __init prosip_init(void) { int ret = -1; buffer_size = 0; printk("<1>[prosip] Init...!\n"); ret = register_sound_dsp(&sound_fops, ver_minor); if(ret < 0) { printk("<1> [prosip] Registration failure\n"); // return ret; } else { ver_minor = ret; // printk("<1> [prosip] DSP Registered succesfully with id %d\n", ret); } buffer = kmalloc(101, GFP_KERNEL); if(buffer == 0) { printk("<1>[prosip] Failed to allocate buffer !!!\n"); // return -ENOMEM; } // return 0; } static void __exit prosip_exit(void) { printk("<1> [prosip] Sound Exit...\n"); unregister_sound_special(ver_minor); if(buffer) { kfree(buffer); } } /* Declaration of memory.c functions */ int prosip_open(struct inode *inode, struct file *filp) { printk("<1> [prosip] Sound Open... \n"); try_module_get(THIS_MODULE); return 0; } // int prosip_release(struct inode *inode, struct file *filp) { printk("<1> [MySound] Sound Release... \n"); module_put(THIS_MODULE); return 0; } // ssize_t prosip_read(struct file *filp, char *buf, size_t count, loff_t *f_pos) { printk("<1> [prosip] Sound read...\n"); printk("<1> [prosip] Writing Count: %d\n", count); if(buffer == 0) { printk("<1> NULL buffer!!! Unable to read"); return 0; } // count = buffer_size; if(read_count == 0) { read_count = buffer_size; } else { read_count = 0; } copy_to_user(buf, buffer, buffer_size); printk("<1> [prosip] Buffer: %s, buf: %s, Count: %d\n", buffer, buf, count); return read_count; } // ssize_t prosip_write(struct file *filp, const char *buf, size_t count, loff_t *f_pos) { printk("<1> [prosip] Sound write...!\n"); printk("<1> [prosip] Writing Count: %d\n", count); // if(buffer == 0) { printk("<1> NULL buffer!!! Unable to write"); return 0; } copy_from_user(buffer, buf, count); buffer[count] = 0; buffer_size = count; printk("<1> [MySound] Writing Buffer: %s, Count: %d\n", buffer, count); return count; } /* * This function is called whenever a process tries to do an ioctl on our * device file. * */ int prosip_ioctl(struct inode *inode, struct file *file, unsigned int ioctl_num, unsigned long ioctl_param) { // return 0; }
Also I found the entry
which make me believe it is inserted into the system as a virtual sound driver.Code:/sys/devices/virtual/sound/dsp1
But how can I set this sound driver as a default driver of the system and let application use this driver for playback and capture audio.
I am using Ubuntu with kernel version 2.6.30-35 generic.
I am a newbie kernel developer and become stuck on how to solve the issue.
Thanks in advance
Khaled


Reply With Quote
