diff options
Diffstat (limited to 'alsa.c')
-rwxr-xr-x | alsa.c | 79 |
1 files changed, 27 insertions, 52 deletions
@@ -12,10 +12,10 @@ #include <sound/initval.h> #include "alsa.h" -#include "core.h" -static struct avirt_alsa_driver *_driver = NULL; +extern struct avirt_coreinfo coreinfo; +static struct snd_card *card = NULL; extern struct snd_pcm_ops pcm_ops; /** @@ -29,29 +29,29 @@ static int pcm_constructor(struct snd_card *card) int i; // Allocate Playback PCM instances - for (i = 0; i < _driver->playback.devices; i++) { + for (i = 0; i < coreinfo.playback.devices; i++) { CHK_ERR(snd_pcm_new(card, - _driver->playback.config[i].devicename, i, - 1, 1, &pcm)); + coreinfo.playback.config[i].devicename, i, + 1, 0, &pcm)); /** Register driver callbacks */ snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &pcm_ops); snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &pcm_ops); pcm->info_flags = 0; - strcpy(pcm->name, _driver->playback.config[i].devicename); + strcpy(pcm->name, coreinfo.playback.config[i].devicename); } // Allocate Capture PCM instances - for (i = 0; i < _driver->capture.devices; i++) { - CHK_ERR(snd_pcm_new(card, _driver->capture.config[i].devicename, + for (i = 0; i < coreinfo.capture.devices; i++) { + CHK_ERR(snd_pcm_new(card, coreinfo.capture.config[i].devicename, i, 0, 1, &pcm)); /** Register driver callbacks */ snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &pcm_ops); pcm->info_flags = 0; - strcpy(pcm->name, _driver->capture.config[i].devicename); + strcpy(pcm->name, coreinfo.capture.config[i].devicename); } return 0; @@ -61,35 +61,31 @@ static int pcm_constructor(struct snd_card *card) * alloc_dev_config - Allocates memory for ALSA device configuration * @return: 0 on success or error code otherwise */ -static int alloc_dev_config(struct avirt_alsa_dev_config **devconfig, - struct avirt_alsa_dev_config *userconfig, +static int alloc_dev_config(struct avirt_alsa_devconfig **devconfig, + struct avirt_alsa_devconfig *userconfig, unsigned numdevices) { if (numdevices == 0) return 0; - *devconfig = kzalloc(sizeof(struct avirt_alsa_dev_config) * numdevices, + *devconfig = kzalloc(sizeof(struct avirt_alsa_devconfig) * numdevices, GFP_KERNEL); if (!(*devconfig)) return -ENOMEM; memcpy(*devconfig, userconfig, - sizeof(struct avirt_alsa_dev_config) * numdevices); + sizeof(struct avirt_alsa_devconfig) * numdevices); return 0; } -struct avirt_alsa_dev_group *avirt_alsa_get_dev_group(int direction) +struct avirt_alsa_group *avirt_alsa_get_group(int direction) { - if (!_driver) { - pr_err("[%s] _driver is NULL", __func__); - return NULL; - } - switch (direction) { case SNDRV_PCM_STREAM_PLAYBACK: + return &coreinfo.playback; case SNDRV_PCM_STREAM_CAPTURE: - return &_driver->playback; + return &coreinfo.capture; default: pr_err("[%s] Direction must be SNDRV_PCM_STREAM_XXX!", __func__); @@ -98,32 +94,18 @@ struct avirt_alsa_dev_group *avirt_alsa_get_dev_group(int direction) } /** - * avirt_alsa_init - Initializes the ALSA driver - * @return: 0 on success or error code otherwise - */ -int avirt_alsa_init() -{ - // Allocate memory for the driver - _driver = kzalloc(sizeof(struct avirt_alsa_driver), GFP_KERNEL); - if (!_driver) - return -ENOMEM; - - return 0; -} - -/** * avirt_alsa_configure_pcm- Configure the PCM device * @config: Device configuration structure array * @direction: Direction of PCM (SNDRV_PCM_STREAM_XXX) * @numdevices: Number of devices (array length) * @return: 0 on success or error code otherwise */ -int avirt_alsa_configure_pcm(struct avirt_alsa_dev_config *config, - int direction, unsigned numdevices) +int avirt_alsa_configure_pcm(struct avirt_alsa_devconfig *config, int direction, + unsigned numdevices) { - struct avirt_alsa_dev_group *group; + struct avirt_alsa_group *group; - group = avirt_alsa_get_dev_group(direction); + group = avirt_alsa_get_group(direction); CHK_NULL(group); CHK_ERR(alloc_dev_config(&group->config, config, numdevices)); @@ -140,12 +122,8 @@ int avirt_alsa_configure_pcm(struct avirt_alsa_dev_config *config, */ int avirt_alsa_register(struct platform_device *devptr) { - struct snd_card *card; static struct snd_device_ops device_ops; - if (!_driver) - return -EFAULT; - // Create the card instance CHK_ERR_V(snd_card_new(&devptr->dev, SNDRV_DEFAULT_IDX1, "avirt", THIS_MODULE, 0, &card), @@ -154,10 +132,9 @@ int avirt_alsa_register(struct platform_device *devptr) strcpy(card->driver, "avirt-alsa-device"); strcpy(card->shortname, "avirt"); strcpy(card->longname, "A virtual sound card driver for ALSA"); - _driver->card = card; // Create new sound device - CHK_ERR_V((snd_device_new(card, SNDRV_DEV_LOWLEVEL, _driver, + CHK_ERR_V((snd_device_new(card, SNDRV_DEV_LOWLEVEL, &coreinfo, &device_ops)), "Failed to create sound device"); @@ -176,14 +153,12 @@ int avirt_alsa_register(struct platform_device *devptr) */ int avirt_alsa_deregister(void) { - CHK_NULL(_driver->card); - snd_card_free(_driver->card); - CHK_NULL(_driver->playback.config); - kfree(_driver->playback.config); - CHK_NULL(_driver->capture.config); - kfree(_driver->capture.config); - CHK_NULL(_driver); - kfree(_driver); + CHK_NULL(card); + snd_card_free(card); + CHK_NULL(coreinfo.playback.config); + kfree(coreinfo.playback.config); + CHK_NULL(coreinfo.capture.config); + kfree(coreinfo.capture.config); return 0; } |