Date: Mon, 19 Jun 2006 07:44:13 GMT From: Ryan Beasley <ryanb@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 99587 for review Message-ID: <200606190744.k5J7iDpa026528@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=99587 Change 99587 by ryanb@ryanb_yuki on 2006/06/19 07:44:06 Added support for SNDCTL_AUDIOINFO to dsp and mixer devices. Also touched the copyright statement in sys/soundcard.h. Folded sound/pcm/dsp.h into sound/pcm/sound.h, since dsp.c now includes a global function (dsp_oss_audioinfo). In sound.c, strncpy => strlcpy after suggestion from Warner Losh. Affected files ... .. //depot/projects/soc2006/rbeasley_sound/sys/dev/sound/pcm/dsp.c#3 edit .. //depot/projects/soc2006/rbeasley_sound/sys/dev/sound/pcm/dsp.h#2 edit .. //depot/projects/soc2006/rbeasley_sound/sys/dev/sound/pcm/mixer.c#4 edit .. //depot/projects/soc2006/rbeasley_sound/sys/dev/sound/pcm/sound.c#5 edit .. //depot/projects/soc2006/rbeasley_sound/sys/dev/sound/pcm/sound.h#3 edit .. //depot/projects/soc2006/rbeasley_sound/sys/sys/soundcard.h#3 edit Differences ... ==== //depot/projects/soc2006/rbeasley_sound/sys/dev/sound/pcm/dsp.c#3 (text+ko) ==== @@ -1036,6 +1036,9 @@ case SNDCTL_SYSINFO: sound_oss_sysinfo((oss_sysinfo *)arg); break; + case SNDCTL_AUDIOINFO: + ret = dsp_oss_audioinfo(i_dev, (oss_audioinfo *)arg); + break; #endif /* !OSSV4_EXPERIMENT */ case SNDCTL_DSP_MAPINBUF: case SNDCTL_DSP_MAPOUTBUF: @@ -1212,4 +1215,129 @@ #endif #ifdef OSSV4_EXPERIMENT +/** + * @brief Handler for SNDCTL_DSP_AUDIOINFO. + * + * Gathers information about the audio device specified in ai->dev. If + * ai->dev == -1, then this function gathers information about the current + * device. If the call comes in on a non-audio device and ai->dev == -1, + * return EINVAL. + * + * This routine is supposed to go practically straight to the hardware, + * getting capabilities directly from the sound card driver, side-stepping + * the intermediate channel interface. + * + * @param dev device on which the ioctl was issued + * @param ai ioctl request data container + * + * @retval 0 success + * @retval EINVAL ai->dev specifies an invalid device + * + * @todo Verify correctness of Doxygen tags. ;) + */ +int +dsp_oss_audioinfo(struct cdev *i_dev, oss_audioinfo *ai) +{ + struct snddev_info *d; + struct cdev *t_cdev; /* handle 1 of target device */ + device_t t_dev; /* handle 2 */ + int t_unit = 0; /* unit # of target device */ + + /* + * Searching by unit number, get device_t and struct cdev handles + * on target audio device. + */ + if (ai->dev == -1) { + t_unit = PCMUNIT(i_dev); + t_cdev = i_dev; + + if ((i_dev->si_devsw == &dsp_cdevsw) && + (t_unit < devclass_get_maxunit(pcm_devclass))) { + t_dev = devclass_get_device(pcm_devclass, t_unit); + } else { + /* Not an audio device */ + return EINVAL; + } + } else { + t_dev = devclass_get_device(pcm_devclass, ai->dev); + if (t_dev == NULL) + return EINVAL; + t_unit = device_get_unit(t_dev); + + LIST_FOREACH(t_cdev, &dsp_cdevsw.d_devs, si_list) { + if (PCMUNIT(t_cdev) == t_unit) + break; + } + + if (t_cdev == NULL) + return EINVAL; + } + + d = dsp_get_info(t_cdev); + + /* + * With all handles collected, zero out the user's container and + * begin filling in its fields. + */ + bzero((void *)ai, sizeof(oss_audioinfo)); + + ai->dev = t_unit; + strlcpy(ai->name, device_get_desc(t_dev), sizeof(ai->name)); + /** + * @todo \c busy requires examining all channels + * + * @note + * \c pid - OSSv4 docs: "Value of -1 means that this information is + * not available or the device is currently not open." Since + * multiple processes may open a device, I'm going with the + * former. + * @par + * \c cmd - Same caveat as \c pid. + */ + ai->pid = -1; + /** + * @todo \c caps - requires going directly to sound card driver + * @todo \c iformats - same todo as \c caps + * @todo \c oformats - same todo as \c caps + * + * @note + * \c magic - OSSv4 docs: "Reserved for internal use by OSS." + * + * @par + * \c card_number - OSSv4 docs: "Number of the sound card where this + * device belongs or -1 if this information is not available. + * Applications should normally not use this field for any + * purpose." + */ + ai->card_number = -1; + /** + * @todo \c song_name - depends first on SNDCTL_[GS]ETSONG + * @todo \c label - depends on SNDCTL_[GS]ETLABEL + * @todo \c port_number - device unit number? + */ + ai->port_number = -1; + ai->mixer_dev = (d->mixer_dev != NULL) ? PCMUNIT(d->mixer_dev) : -1; + ai->real_device = t_unit; + strlcpy(ai->devnode, t_cdev->si_name, sizeof(ai->devnode)); + ai->enabled = device_is_attached(t_dev) ? 1 : 0; + /** + * @note + * \c flags - OSSv4 docs: "Reserved for future use." + * + * @todo \c min_rate - same todo as \c caps + * @todo \c max_rate - same todo as \c caps + * @todo \c nrates - same todo as \c caps + * @todo \c rates - same todo as \c caps + * @todo \c min_channels - same todo as \c caps + * @todo \c max_channels - same todo as \c caps + * + * @note + * \c binding - OSSv4 docs: "Reserved for future use." + * + * @todo \c handle - haven't decided how to generate this yet; bus, + * vendor, device IDs? + */ + + return 0; +} #endif /* !OSSV4_EXPERIMENT */ ==== //depot/projects/soc2006/rbeasley_sound/sys/dev/sound/pcm/dsp.h#2 (text+ko) ==== @@ -1,3 +1,4 @@ +#ifndef _PCMDSP_H_ /*- * Copyright (c) 1999 Cameron Grant <cg@freebsd.org> * All rights reserved. @@ -27,3 +28,9 @@ */ extern struct cdevsw dsp_cdevsw; + +#ifdef OSSV4_EXPERIMENT +int dsp_oss_audioinfo(struct cdev *, oss_audioinfo *); +#endif + +#endif /* !_PCMDSP_H_ */ ==== //depot/projects/soc2006/rbeasley_sound/sys/dev/sound/pcm/mixer.c#4 (text+ko) ==== @@ -533,6 +533,10 @@ sound_oss_sysinfo((oss_sysinfo *)arg); snd_mtxunlock(m->lock); return 0; + } else if (cmd == SNDCTL_AUDIOINFO) { + ret = dsp_oss_audioinfo(i_dev, (oss_audioinfo *)arg); + snd_mtxunlock(m->lock); + return ret; } #endif /* !OSSV4_EXPERIMENT */ snd_mtxunlock(m->lock); ==== //depot/projects/soc2006/rbeasley_sound/sys/dev/sound/pcm/sound.c#5 (text+ko) ==== @@ -1140,10 +1140,8 @@ static char si_product[] = "FreeBSD native OSS ABI"; static char si_version[] = __XSTRING(__FreeBSD_version); - strncpy(si->product, si_product, sizeof(si->product) - 1); - si->product[sizeof(si->product) - 1] = '\0'; - strncpy(si->version, si_version, sizeof(si->version) - 1); - si->product[sizeof(si->product) - 1] = '\0'; + strlcpy(si->product, si_product, sizeof(si->product)); + strlcpy(si->version, si_version, sizeof(si->version)); si->versionnum = SOUND_VERSION; si->numaudios = (pcm_devclass != NULL) ? devclass_get_count(pcm_devclass) : ==== //depot/projects/soc2006/rbeasley_sound/sys/dev/sound/pcm/sound.h#3 (text+ko) ==== @@ -92,6 +92,7 @@ #include <dev/sound/pcm/channel.h> #include <dev/sound/pcm/feeder.h> #include <dev/sound/pcm/mixer.h> +#include <dev/sound/pcm/dsp.h> #define PCM_SOFTC_SIZE 512 ==== //depot/projects/soc2006/rbeasley_sound/sys/sys/soundcard.h#3 (text+ko) ==== @@ -3,7 +3,7 @@ */ /*- - * Copyright by Hannu Savolainen 1993 + * Copyright by Hannu Savolainen 1993 / 4Front Technologies 1993-2006 * Modified for the new FreeBSD sound driver by Luigi Rizzo, 1997 * * Redistribution and use in source and binary forms, with or without @@ -32,6 +32,12 @@ * $FreeBSD: src/sys/sys/soundcard.h,v 1.45 2005/07/31 16:08:03 netchild Exp $ */ +/* + * Unless coordinating changes with 4Front Technologies, do NOT make any + * modifications to ioctl commands, types, etc. that would break + * compatibility with the OSS API. + */ + #ifndef _SYS_SOUNDCARD_H_ #define _SYS_SOUNDCARD_H_ /* @@ -1439,6 +1445,15 @@ /***********************************************************************/ +/* + * Sections copyright 4Front Technologies 1993-2006. + * + * This file also contains changes taken in summer 2006 from + * sys/soundcard.h of 4Front Technologies OSS driver which contains + * the same copyright as above. + * + */ + /** * XXX OSSv4 defines -- some bits taken straight out of the new * sys/soundcard.h bundled with recent OSS releases. @@ -1446,6 +1461,9 @@ * NB: These macros and structures will be reorganized and inserted * in appropriate places throughout this file once the code begins * to take shape. + * + * @todo reorganize layout more like the 4Front version + * @todo ask about maintaining __SIOWR vs. _IOWR ioctl cmd defines */ #define OSSV4_EXPERIMENT 1 #ifdef OSSV4_EXPERIMENT @@ -1455,8 +1473,14 @@ # define SOUND_VERSION 0x040000 #endif /* !SOUND_VERSION */ +#define OSS_LONGNAME_SIZE 64 +#define OSS_LABEL_SIZE 16 +#define OSS_DEVNODE_SIZE 32 +typedef char oss_longname_t[OSS_LONGNAME_SIZE]; +typedef char oss_label_t[OSS_LABEL_SIZE]; +typedef char oss_devnode_t[OSS_DEVNODE_SIZE]; + /** - * @struct oss_sysinfo * @brief Argument for SNDCTL_SYSINFO ioctl. * * For use w/ the SNDCTL_SYSINFO ioctl available on audio (/dev/dsp*), @@ -1485,6 +1509,48 @@ #define SNDCTL_SYSINFO _IOR ('X', 1, oss_sysinfo) #define OSS_SYSINFO SNDCTL_SYSINFO /* Old name */ +#define OPEN_READ PCM_ENABLE_INPUT +#define OPEN_WRITE PCM_ENABLE_OUTPUT +#define OPEN_READWRITE (OPEN_READ|OPEN_WRITE) + +/** + * @brief Argument for SNDCTL_AUDIOINFO ioctl. + * + * For use w/ the SNDCTL_AUDIOINFO ioctl available on audio (/dev/dsp*) + * devices. + */ +typedef struct oss_audioinfo +{ + int dev; /* Audio device number */ + char name[64]; + int busy; /* 0, OPEN_READ, OPEN_WRITE or OPEN_READWRITE */ + int pid; + int caps; /* DSP_CAP_INPUT, DSP_CAP_OUTPUT */ + int iformats, oformats; + int magic; /* Reserved for internal use */ + char cmd[64]; /* Command using the device (if known) */ + int card_number; + int port_number; + int mixer_dev; + int real_device; /* Obsolete field. Replaced by devnode */ + int enabled; /* 1=enabled, 0=device not ready at this moment */ + int flags; /* For internal use only - no practical meaning */ + int min_rate, max_rate; /* Sample rate limits */ + int min_channels, max_channels; /* Number of channels supported */ + int binding; /* DSP_BIND_FRONT, etc. 0 means undefined */ + int rate_source; + char handle[32]; + #define MAX_SAMPLE_RATES 20 /* Cannot be changed */ + unsigned int nrates, rates[MAX_SAMPLE_RATES]; /* Please read the manual before using these */ + oss_longname_t song_name; /* Song name (if given) */ + oss_label_t label; /* Device label (if given) */ + int latency; /* In usecs, -1=unknown */ + oss_devnode_t devnode; /* Device special file name (inside /dev) */ + int filler[186]; +} oss_audioinfo; + +#define SNDCTL_AUDIOINFO _IOWR('X', 7, oss_audioinfo) + #endif /* !OSSV4_EXPERIMENT */ #endif /* !_SYS_SOUNDCARD_H_ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200606190744.k5J7iDpa026528>