Annotation of driverkit/libDriver/Kernel/audio_server.m, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.1 (the "License").  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License.
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: /*
                     25:  * audio_server.m
                     26:  *
                     27:  * Copyright (c) 1991, NeXT Computer, Inc.  All rights reserved.
                     28:  *
                     29:  *     Field user messages for audio driver.
                     30:  *
                     31:  * HISTORY
                     32:  *     08/10/92/mtm    Original coding from m68k version.
                     33:  */
                     34: 
                     35: #import "audioLog.h"
                     36: #import <driverkit/IOAudioPrivate.h>
                     37: #import "InputStream.h"
                     38: #import "OutputStream.h"
                     39: #import "audio_server.h"
                     40: #import <bsd/dev/audioTypes.h>
                     41: #import "audioReply.h"
                     42: #import <driverkit/kernelDriver.h>     // for IOVmTaskSelf()
                     43: #import <mach/vm_param.h>              // PAGE_SIZE
                     44: #import <kernserv/prototypes.h>
                     45: 
                     46: /*
                     47:  * DO NOT PUT ANY STATIC DATA IN THIS FILE.
                     48:  * These routines may be used by multiple IOAudio instances
                     49:  * if more sound boards are added.
                     50:  */
                     51: 
                     52: /*
                     53:  * Mig calls this to convert the port a message is
                     54:  * received on into each routine's first argument.
                     55:  */
                     56: audio_device_t audio_port_to_device(port_t port)
                     57: {
                     58:     AudioChannel *chan = nil;
                     59: 
                     60:     if (chan = [IOAudio _channelForUserPort:port])
                     61:        return (audio_device_t)chan;
                     62:     else {
                     63:        log_error(("Audio: server can't translate port to channel\n"));
                     64:        return (audio_device_t)0;
                     65:     }
                     66: }
                     67: 
                     68: /*
                     69:  * Mig calls this to convert the port a message is
                     70:  * received on into each routine's first argument.
                     71:  */
                     72: audio_stream_t audio_port_to_stream(port_t port)
                     73: {
                     74:     AudioStream *stream = nil;
                     75: 
                     76:     if (stream = [AudioChannel streamForUserPort:port])
                     77:        return (audio_stream_t)stream;
                     78:     else {
                     79:        log_error(("Audio: server can't translate port to stream\n"));
                     80:        return (audio_stream_t)0;
                     81:     }
                     82: }
                     83: 
                     84: /**************************
                     85:  * Generic device routines.
                     86:  **************************/
                     87: 
                     88: /*
                     89:  * Get current exclusive stream owner, may be PORT_NULL.
                     90:  */
                     91: kern_return_t _NXAudioGetExclusiveUser(AudioChannel *chan,
                     92:                                       port_t *stream_owner)
                     93: {
                     94:     xpr_audio_user("AU: GetExclUser: chan=0x%x, owner=0x%x\n", chan, stream_owner, 3,4,5);
                     95:     if (!chan)
                     96:        return _NXAUDIO_ERR_PORT;
                     97:     *stream_owner = [chan exclusiveUser];
                     98:     return _NXAUDIO_SUCCESS;
                     99: }
                    100: 
                    101: /*
                    102:  * Establish exclusive use of streams.
                    103:  * If stream_owner is PORT_NULL, exclusive use is canceled.
                    104:  */
                    105: kern_return_t _NXAudioSetExclusiveUser(AudioChannel *chan, port_t stream_owner)
                    106: {
                    107:     xpr_audio_user("AU: SetExclUser: chan=0x%x, owner=%d\n", chan, stream_owner,3,4,5);
                    108:     if (!chan)
                    109:        return _NXAUDIO_ERR_PORT;
                    110:     [chan setExclusiveUser:stream_owner];
                    111:     return _NXAUDIO_SUCCESS;
                    112: }
                    113: 
                    114: /*
                    115:  * Get dma buffer size and count.
                    116:  * (OBSOLETE but must still be supported.)
                    117:  */
                    118: kern_return_t _NXAudioGetBufferOptions(AudioChannel *chan, u_int *size,
                    119:                                       u_int *count)
                    120: {
                    121:     xpr_audio_user("AU: GetBufOpts: chan=0x%x, size=0x%x, count=0x%x\n",
                    122:                   chan, size, count, 4,5);
                    123:     if (!chan)
                    124:        return _NXAUDIO_ERR_PORT;
                    125:     *size = [[chan audioDevice] _intValueForParameter:NX_SoundDeviceBufferSize
                    126:                forObject:chan];
                    127:     *count = [[chan audioDevice] _intValueForParameter:NX_SoundDeviceBufferCount
                    128:                 forObject:chan];
                    129:     return _NXAUDIO_SUCCESS;
                    130: }
                    131: 
                    132: /*
                    133:  * Set dma buffer size and count.
                    134:  * (OBSOLETE but must still be supported.)
                    135:  */
                    136: kern_return_t _NXAudioSetBufferOptions(AudioChannel *chan,
                    137:                                       port_t stream_owner,
                    138:                                       u_int size, u_int count)
                    139: {
                    140:     xpr_audio_user("AU: SetBufOpts: chan=0x%x, owner=%d, size=%d, count=%d\n",
                    141:                   chan, stream_owner, size, count, 5);
                    142:     if (!chan)
                    143:        return _NXAUDIO_ERR_PORT;
                    144:     if (![chan checkOwner:stream_owner])
                    145:        return _NXAUDIO_ERR_NOT_OWNER;
                    146:     (void)[[chan audioDevice] _setParameter:NX_SoundDeviceBufferSize toInt:size
                    147:           forObject:chan];
                    148:     (void)[[chan audioDevice] _setParameter:NX_SoundDeviceBufferCount toInt:count
                    149:           forObject:chan];
                    150:     return _NXAUDIO_SUCCESS;
                    151: }
                    152: 
                    153: /*
                    154:  * Stream control of owned streams.
                    155:  */
                    156: kern_return_t _NXAudioControlStreams(AudioChannel *chan, port_t stream_owner,
                    157:                                     int action)
                    158: {
                    159:     xpr_audio_user("AU: ControlStreams: chan=0x%x, owner=%d, action=%d\n",
                    160:                   chan, stream_owner, action, 4,5);
                    161:     if (!chan || !stream_owner)
                    162:        return _NXAUDIO_ERR_PORT;
                    163:     if (![chan checkOwner:stream_owner])
                    164:        return _NXAUDIO_ERR_NOT_OWNER;
                    165:     if (!(action == _NXAUDIO_STREAM_PAUSE ||
                    166:          action == _NXAUDIO_STREAM_RESUME ||
                    167:          action == _NXAUDIO_STREAM_ABORT ||
                    168:          action == _NXAUDIO_STREAM_RETURN_DATA))
                    169:        return _NXAUDIO_ERR_CONTROL;
                    170: 
                    171:     [chan controlStreams:action];
                    172:     return _NXAUDIO_SUCCESS;
                    173: }
                    174: 
                    175: /*
                    176:  * Add a stream.
                    177:  */
                    178: kern_return_t _NXAudioAddStream(AudioChannel *chan, port_t *stream_port,
                    179:                                port_t stream_owner, int stream_id,
                    180:                                u_int stream_type)
                    181:     
                    182: {
                    183:     xpr_audio_user("AU: AddStream: chan=0x%x, stream=0x%x, owner=%d, id=%d, "
                    184:                   "type=%d\n", chan, stream_port, stream_owner, stream_id,
                    185:                   stream_type);
                    186:     if (!chan || !stream_owner)
                    187:        return _NXAUDIO_ERR_PORT;
                    188:     if (![chan checkOwner:stream_owner])
                    189:        return _NXAUDIO_ERR_NOT_OWNER;
                    190: 
                    191:     return ([chan addStreamTag:stream_id user:stream_port
                    192:                owner:stream_owner type:stream_type] ?
                    193:            _NXAUDIO_SUCCESS : KERN_FAILURE);
                    194: }
                    195: 
                    196: /*
                    197:  * Get device peak options.
                    198:  * (OBSOLETE but must still be supported.)
                    199:  */
                    200: kern_return_t _NXAudioGetDevicePeakOptions(AudioChannel *chan, u_int *enabled,
                    201:                                           u_int *history)
                    202: {
                    203:     xpr_audio_user("AU: GetDevPeakOpts: chan=0x%x, enabled=0x%x, "
                    204:                "history=0x%x\n", chan, enabled, history, 4,5);
                    205:     if (!chan)
                    206:        return _NXAUDIO_ERR_PORT;
                    207:     *enabled = [[chan audioDevice]
                    208:                _intValueForParameter:NX_SoundDeviceDetectPeaks
                    209:                forObject:chan];
                    210:     *history = 1;      /* peak history no longer supported */
                    211:     return _NXAUDIO_SUCCESS;
                    212: }
                    213: 
                    214: /*
                    215:  * Set device peak options.
                    216:  * (OBSOLETE but must still be supported.)
                    217:  */
                    218: kern_return_t _NXAudioSetDevicePeakOptions(AudioChannel *chan,
                    219:                                           port_t stream_owner,
                    220:                                           u_int enabled,
                    221:                                           u_int history)
                    222: {
                    223:     xpr_audio_user("AU: SetDevPeakOpts: chan=0x%x, owner=%d, enabled=%d, "
                    224:                   "history=%\n", chan, stream_owner, enabled, history, 5);
                    225:     if (!chan)
                    226:        return _NXAUDIO_ERR_PORT;
                    227:     if (![chan checkOwner:stream_owner])
                    228:        return _NXAUDIO_ERR_NOT_OWNER;
                    229:     (void)[[chan audioDevice] _setParameter:NX_SoundDeviceDetectPeaks
                    230:              toInt:(enabled ? YES : NO) forObject:chan];
                    231:     /* peak history no longer supported */
                    232:     return _NXAUDIO_SUCCESS;
                    233: }
                    234: 
                    235: /*
                    236:  * Get device peak.
                    237:  */
                    238: kern_return_t _NXAudioGetDevicePeak(AudioChannel *chan, u_int *peak_left,
                    239:                                    u_int *peak_right)
                    240: {
                    241:     xpr_audio_user("AU: GetDevPeak: chan=0x%x, peak_l=0x%x, peak_r=0x%x\n",
                    242:                   chan, peak_left, peak_right, 4,5);
                    243:     if (!chan)
                    244:        return _NXAUDIO_ERR_PORT;
                    245:     if (![[chan audioDevice] _intValueForParameter:NX_SoundDeviceDetectPeaks
                    246:        forObject:chan])
                    247:        return _NXAUDIO_ERR_PEAK;
                    248:     [chan getPeakLeft:peak_left right:peak_right];
                    249:     return _NXAUDIO_SUCCESS;
                    250: }
                    251: 
                    252: /*
                    253:  * Get clip count.
                    254:  */
                    255: kern_return_t _NXAudioGetClipCount(AudioChannel *chan, u_int *count)
                    256: {
                    257:     xpr_audio_user("AU: GetClipCount: chan=0x%x, count=0x%x\n", chan, count,
                    258:                   3,4,5);
                    259:     if (!chan)
                    260:        return _NXAUDIO_ERR_PORT;
                    261:     *count = [chan clipCount];
                    262:     return _NXAUDIO_SUCCESS;
                    263: }
                    264: 
                    265: /********************
                    266:  * Soundout routines.
                    267:  ********************/
                    268: 
                    269: /*
                    270:  * Get soundout options.
                    271:  * (OBSOLETE but must still be supported.)
                    272:  */
                    273: kern_return_t _NXAudioGetSndoutOptions(AudioChannel *chan, u_int *bits)
                    274: {
                    275:     IOAudio *dev;
                    276: 
                    277:     xpr_audio_user("AU: GetSndoutOpts: chan=0x%x, bits=0x%x\n", chan, bits, 3,4,5);
                    278:     if (!chan)
                    279:        return _NXAUDIO_ERR_PORT;
                    280:     *bits = 0;
                    281:     dev = [chan audioDevice];
                    282: 
                    283:     if ([dev _intValueForParameter:NX_SoundDeviceInsertZeros
                    284:         forObject:chan])
                    285:        *bits |= _NXAUDIO_SNDOUT_ZEROFILL;
                    286:     if ([dev _intValueForParameter:NX_SoundDeviceRampUp
                    287:         forObject:chan])
                    288:        *bits |= _NXAUDIO_SNDOUT_RAMPUP;
                    289:     if ([dev _intValueForParameter:NX_SoundDeviceRampDown
                    290:         forObject:chan])
                    291:        *bits |= _NXAUDIO_SNDOUT_RAMPDOWN;
                    292:     if ([dev _intValueForParameter:NX_SoundDeviceDeemphasize
                    293:        forObject:chan])
                    294:        *bits |= _NXAUDIO_SNDOUT_DEEMPHASIS;
                    295:     if (![dev _intValueForParameter:NX_SoundDeviceMuteSpeaker
                    296:        forObject:chan])
                    297:         *bits |= _NXAUDIO_SNDOUT_SPEAKER_ON;
                    298: 
                    299:     return _NXAUDIO_SUCCESS;
                    300: }
                    301: 
                    302: /*
                    303:  * Set soundout options.
                    304:  * (OBSOLETE but must still be supported.)
                    305:  */
                    306: kern_return_t _NXAudioSetSndoutOptions(AudioChannel *chan,
                    307:                                       port_t stream_owner,
                    308:                                       u_int bits)
                    309: {
                    310:     IOAudio *dev;
                    311: 
                    312:     xpr_audio_user("AU: SetSndoutOpts: chan=0x%x, owner=%d, bits=0x%x\n", chan,
                    313:                   stream_owner, bits, 4,5);
                    314:     if (!chan)
                    315:        return _NXAUDIO_ERR_PORT;
                    316:     if (![chan checkOwner:stream_owner])
                    317:        return _NXAUDIO_ERR_NOT_OWNER;
                    318:     dev = [chan audioDevice];
                    319: 
                    320:     if (bits & _NXAUDIO_SNDOUT_ZEROFILL)
                    321:        (void)[dev _setParameter:NX_SoundDeviceInsertZeros toInt:YES
                    322:             forObject:chan];
                    323:     else
                    324:        (void)[dev _setParameter:NX_SoundDeviceInsertZeros toInt:NO
                    325:             forObject:chan];
                    326:     if (bits & _NXAUDIO_SNDOUT_RAMPUP)
                    327:        (void)[dev _setParameter:NX_SoundDeviceRampUp toInt:YES
                    328:              forObject:chan];
                    329:     else
                    330:        (void)[dev _setParameter:NX_SoundDeviceRampUp toInt:NO
                    331:               forObject:chan];
                    332:     if (bits & _NXAUDIO_SNDOUT_RAMPDOWN)
                    333:        (void)[dev _setParameter:NX_SoundDeviceRampDown toInt:YES
                    334:               forObject:chan];
                    335:     else
                    336:        (void)[dev _setParameter:NX_SoundDeviceRampDown toInt:NO
                    337:               forObject:chan];
                    338:     if (bits & _NXAUDIO_SNDOUT_DEEMPHASIS)
                    339:        (void)[dev _setParameter:NX_SoundDeviceDeemphasize toInt:YES
                    340:               forObject:chan];
                    341:     else
                    342:        (void)[dev _setParameter:NX_SoundDeviceDeemphasize toInt:NO
                    343:               forObject:chan];
                    344:     if (bits & _NXAUDIO_SNDOUT_SPEAKER_ON)
                    345:        (void)[dev _setParameter:NX_SoundDeviceMuteSpeaker toInt:NO
                    346:               forObject:chan];
                    347:     else
                    348:        (void)[dev _setParameter:NX_SoundDeviceMuteSpeaker toInt:YES
                    349:               forObject:chan];
                    350: 
                    351:     return _NXAUDIO_SUCCESS;
                    352: }
                    353: 
                    354: /*
                    355:  * Get speaker attenuation.
                    356:  * (OBSOLETE but must still be supported.)
                    357:  */
                    358: kern_return_t _NXAudioGetSpeaker(AudioChannel *chan, int *left, int *right)
                    359: {
                    360:     xpr_audio_user("AU: GetSpeaker: chan=0x%x, left=0x%x, right=0x%x\n", chan,
                    361:                   left, right, 4,5);
                    362:     if (!chan)
                    363:        return _NXAUDIO_ERR_PORT;
                    364:     *left = [[chan audioDevice]
                    365:             _intValueForParameter:NX_SoundDeviceOutputAttenuationLeft
                    366:             forObject:chan];
                    367:     *right = [[chan audioDevice]
                    368:              _intValueForParameter:NX_SoundDeviceOutputAttenuationRight
                    369:              forObject:chan];
                    370:     return _NXAUDIO_SUCCESS;
                    371: }
                    372: 
                    373: /*
                    374:  * Set speaker attenuation.
                    375:  * (OBSOLETE but must still be supported.)
                    376:  */
                    377: kern_return_t _NXAudioSetSpeaker(AudioChannel *chan,
                    378:                                 port_t stream_owner,
                    379:                                 int left, int right)
                    380: {
                    381:     xpr_audio_user("AU: SetSpeaker: chan=0x%x, owner=%d, left=%d, right=%d\n",
                    382:                   chan, stream_owner, left, right, 5);
                    383:     if (!chan)
                    384:        return _NXAUDIO_ERR_PORT;
                    385:     if (![chan checkOwner:stream_owner])
                    386:        return _NXAUDIO_ERR_NOT_OWNER;
                    387:     (void)[[chan audioDevice]
                    388:           _setParameter:NX_SoundDeviceOutputAttenuationLeft toInt:left
                    389:          forObject:chan];
                    390:     (void)[[chan audioDevice]
                    391:           _setParameter:NX_SoundDeviceOutputAttenuationRight toInt:right
                    392:           forObject:chan];
                    393:     return _NXAUDIO_SUCCESS;
                    394: }
                    395: 
                    396: /**************************
                    397:  * Generic stream routines.
                    398:  **************************/
                    399: 
                    400: /*
                    401:  * Set stream gain.
                    402:  */
                    403: kern_return_t _NXAudioSetStreamGain(OutputStream *stream, int left, int right)
                    404: {
                    405:     xpr_audio_user("AU: SetStreamGain: stream=0x%x, left=%d, right=%d\n",
                    406:                   stream, left, right, 4,5);
                    407:     [[[stream channel] audioDevice] _setParameter:NX_SoundStreamGainLeft
                    408:         toInt:left forObject:stream];
                    409:     [[[stream channel] audioDevice] _setParameter:NX_SoundStreamGainRight
                    410:         toInt:right forObject:stream];
                    411:     return _NXAUDIO_SUCCESS;
                    412: }
                    413: 
                    414: /*
                    415:  * Change stream owner of an existing stream.
                    416:  */
                    417: kern_return_t _NXAudioChangeStreamOwner(AudioStream *stream,
                    418:                                        port_t stream_owner)
                    419: {
                    420:     xpr_audio_user("AU: ChangeStreamOwner: stream=0x%x, owner=%d\n",
                    421:                   stream, stream_owner, 3,4,5);
                    422:     if (!stream || !stream_owner)
                    423:        return _NXAUDIO_ERR_PORT;
                    424:     [stream setOwner:stream_owner];
                    425:     return _NXAUDIO_SUCCESS;
                    426: }
                    427: 
                    428: /*
                    429:  * Stream control.
                    430:  */
                    431: kern_return_t _NXAudioStreamControl(AudioStream *stream, int action,
                    432:                                    audio_time_t time)
                    433: {
                    434:     xpr_audio_user("AU: StreamControl: stream=0x%x, action=%d, time=%d:%d\n",
                    435:                   stream, action, time.tv_sec, time.tv_usec, 5);
                    436:     if (!stream)
                    437:        return _NXAUDIO_ERR_PORT;
                    438:     if (![[stream channel] checkOwner:[stream ownerPort]])
                    439:        return _NXAUDIO_ERR_NOT_OWNER;
                    440: 
                    441:     switch (action) {
                    442:       case _NXAUDIO_STREAM_ABORT:
                    443:        [stream control:AC_ControlAbort atTime:time];
                    444:        break;
                    445:       case _NXAUDIO_STREAM_PAUSE:
                    446:        [stream control:AC_ControlPause atTime:time];
                    447:        break;
                    448:       case _NXAUDIO_STREAM_RESUME:
                    449:        [stream control:AC_ControlResume atTime:time];
                    450:        break;
                    451:       case _NXAUDIO_STREAM_RETURN_DATA:
                    452:        [stream returnRecordedData];
                    453:        break;
                    454:       default:
                    455:        return _NXAUDIO_ERR_CONTROL;
                    456:        break;
                    457:     }
                    458:     return _NXAUDIO_SUCCESS;
                    459: }
                    460: 
                    461: /*
                    462:  * Stream info.
                    463:  */
                    464: kern_return_t _NXAudioStreamInfo(AudioStream *stream, u_int *bytes_processed,
                    465:                                u_int *time_stamp)
                    466: {
                    467:     xpr_audio_user("AU: StreamInfo: stream=0x%x, bytes=0x%x\n",
                    468:                   stream, bytes_processed, 3,4,5);
                    469:     if (!stream)
                    470:        return _NXAUDIO_ERR_PORT;
                    471:     (void) [stream bytesProcessed: bytes_processed atTime: time_stamp];
                    472:     return _NXAUDIO_SUCCESS;
                    473: }
                    474: 
                    475: /*
                    476:  * Remove a stream.
                    477:  */
                    478: kern_return_t _NXAudioRemoveStream(AudioStream *stream)
                    479: {
                    480:     xpr_audio_user("AU: RemoveStream: stream=0x%x\n", stream, 2,3,4,5);
                    481:     if (!stream)
                    482:        return _NXAUDIO_ERR_PORT;
                    483:     [[stream channel] removeStream:stream];
                    484:     return _NXAUDIO_SUCCESS;
                    485: }
                    486: 
                    487: /***************************
                    488:  * Playback stream routines.
                    489:  ***************************/
                    490: 
                    491: /*
                    492:  * Enqueue play request to stream.
                    493:  * (OBSOLETE but must still be supported.)
                    494:  */
                    495: kern_return_t _NXAudioPlayStream(OutputStream *stream, pointer_t data,
                    496:                                 u_int count, int tag, int channel_count,
                    497:                                 int sample_rate,
                    498:                                 u_int left_gain, u_int right_gain,
                    499:                                 u_int low_water, u_int high_water,
                    500:                                 port_t reply_port, u_int messages)
                    501: {
                    502:     kern_return_t ret, krtn;
                    503:     audio_array_t params;
                    504:     audio_array_t values;
                    505: 
                    506:     xpr_audio_user("AU: PlayStream: stream=0x%x %d %d %d %d\n", 
                    507:                stream, data, count, tag, channel_count);
                    508:     
                    509:     if (!stream)
                    510:        return _NXAUDIO_ERR_PORT;
                    511:     if (![[stream channel] checkOwner:[stream ownerPort]]) {
                    512:        ret = _NXAUDIO_ERR_NOT_OWNER;
                    513:        goto error_return;
                    514:     }
                    515:     if (!count) {
                    516:        ret = _NXAUDIO_ERR_SIZE;
                    517:        goto error_return;
                    518:     }
                    519: 
                    520:     /*
                    521:      * left and right gains no longer supported.
                    522:      */
                    523:     params[0] = NX_SoundStreamChannelCount;
                    524:     values[0] = channel_count;
                    525:     params[1] = NX_SoundStreamSamplingRate;
                    526:     /*
                    527:      * In this interface, sample rate is an enum constant!
                    528:      */
                    529:     values[1] = (sample_rate == _NXAUDIO_RATE_22050 ? 22050 : 44100);
                    530:     params[2] = NX_SoundStreamLowWaterMark;
                    531:     values[2] = low_water;
                    532:     params[3] = NX_SoundStreamHighWaterMark;
                    533:     values[3] = high_water;
                    534:     (void)[[[stream channel] audioDevice]
                    535:         _setParameters:(const NXSoundParameterTag *)params
                    536:         toValues:values count:4 forObject:stream];
                    537: 
                    538:     if ([stream playBuffer:(void *)data size:count
                    539:                                      tag:tag
                    540:                                  replyTo:reply_port
                    541:                                replyMsgs:messages])
                    542:        return _NXAUDIO_SUCCESS;
                    543:     else
                    544:        ret = _NXAUDIO_ERR_SIZE;
                    545: 
                    546:   error_return:
                    547:     krtn = vm_deallocate(task_self(), data, count);
                    548:     if (krtn != KERN_SUCCESS)
                    549:        log_error(("Audio: audio server vm_deallocate error: %s (%d)\n",
                    550:                   mach_error_string(krtn), krtn));
                    551:     xpr_audio_user("AU: playStream returns err %d\n", krtn, 2,3,4,5);
                    552:     return ret;
                    553: }
                    554: 
                    555: /*
                    556:  * Set stream peak options.
                    557:  * (OBSOLETE but must still be supported.)
                    558:  */
                    559: kern_return_t _NXAudioSetStreamPeakOptions(OutputStream *stream, u_int enabled,
                    560:                                           u_int history)
                    561: {
                    562:     xpr_audio_user("AU: SetStreamPeakOpts: stream=0x%x, enabled=%d, "
                    563:                "history=%d\n", stream, enabled, history, 4,5);
                    564:     if (!stream)
                    565:        return _NXAUDIO_ERR_PORT;
                    566:     (void)[[[stream channel] audioDevice]
                    567:              _setParameter:NX_SoundStreamDetectPeaks
                    568:              toInt:(enabled ? YES : NO) forObject:stream];
                    569:     /* peak history no longer supported */
                    570:     return _NXAUDIO_SUCCESS;
                    571: }
                    572: 
                    573: /*
                    574:  * Get stream peak.
                    575:  */
                    576: kern_return_t _NXAudioGetStreamPeak(OutputStream *stream,
                    577:                                    u_int *peak_left, u_int *peak_right)
                    578: {
                    579:     xpr_audio_user("AU: GetStreamPeak: stream=0x%x, peak_l=0x%x, "
                    580:                        "peak_r=0x%x\n", stream, peak_left, peak_right, 4,5);
                    581:     if (!stream)
                    582:        return _NXAUDIO_ERR_PORT;
                    583:     if (![[[stream channel] audioDevice]
                    584:        _intValueForParameter:NX_SoundStreamDetectPeaks forObject:stream])
                    585:        return _NXAUDIO_ERR_PEAK;
                    586:     [stream getPeakLeft:peak_left right:peak_right];
                    587:     return _NXAUDIO_SUCCESS;
                    588: }
                    589: 
                    590: /****************************
                    591:  * Recording stream routines.
                    592:  ****************************/
                    593: 
                    594: /*
                    595:  * Enqueue record request to stream.
                    596:  * (OBSOLETE but must still be supported.)
                    597:  */
                    598: kern_return_t _NXAudioRecordStream(InputStream *stream, u_int count,
                    599:                                   int tag,
                    600:                                   u_int low_water, u_int high_water,
                    601:                                   port_t reply_port, u_int messages)
                    602: {
                    603:     audio_array_t params;
                    604:     audio_array_t values;
                    605: 
                    606:     xpr_audio_user("AU: RecordStream: stream=0x%x %d %d\n", 
                    607:                stream, count, tag, 4, 5);
                    608:     if (!stream)
                    609:        return _NXAUDIO_ERR_PORT;
                    610:     if (![[stream channel] checkOwner:[stream ownerPort]])
                    611:        return _NXAUDIO_ERR_NOT_OWNER;
                    612:     if (!count)
                    613:        return _NXAUDIO_ERR_SIZE;
                    614: 
                    615:     params[0] = NX_SoundStreamLowWaterMark;
                    616:     values[0] = low_water;
                    617:     params[1] = NX_SoundStreamHighWaterMark;
                    618:     values[1] = high_water;
                    619:     (void)[[[stream channel] audioDevice]
                    620:         _setParameters:(const NXSoundParameterTag *)params
                    621:         toValues:values count:2 forObject:stream];
                    622: 
                    623:     if ([stream recordSize:count tag:tag
                    624:                          replyTo:reply_port
                    625:                        replyMsgs:messages])
                    626:        return _NXAUDIO_SUCCESS;
                    627:     else
                    628:        return _NXAUDIO_ERR_SIZE;
                    629: }
                    630: 
                    631: /*
                    632:  * Deal with death of a port.
                    633:  */
                    634: void audio_port_gone(port_t port)
                    635: {
                    636:     AudioStream *stream = nil;
                    637:     AudioChannel *chan = nil;
                    638:     boolean_t more = TRUE;
                    639: 
                    640:     if (port == PORT_NULL)
                    641:        return;
                    642: 
                    643:     while (more) {
                    644:        more = FALSE;
                    645:        if (chan = [IOAudio _channelForExclusivePort:port]) {
                    646:            xpr_audio_user("AU: audio_port_gone: chan 0x%x excl user %d\n",
                    647:                           chan, port, 3,4,5);
                    648:            [chan setExclusiveUser:PORT_NULL];
                    649:            more = TRUE;
                    650:        } else if (stream = [AudioChannel streamForOwnerPort:port]) {
                    651:            xpr_audio_user("AU: audio_port_gone: stream 0x%x owner %d\n",
                    652:                           stream, port, 3,4,5);
                    653:            _NXAudioRemoveStream(stream);
                    654:            more = TRUE;
                    655:        }
                    656:     }
                    657: }
                    658: 
                    659: /****************************
                    660:  * New for 3.1.
                    661:  ****************************/
                    662: 
                    663: /*
                    664:  * Play and record with current parameters.
                    665:  */
                    666: 
                    667: kern_return_t _NXAudioPlayStreamData(OutputStream *stream, pointer_t data,
                    668:                                     u_int count, int tag,
                    669:                                     port_t reply_port, u_int messages)
                    670: {
                    671:     xpr_audio_user("AU: playStreamData\n", 0,0,0,0,0);
                    672:     if (!stream)
                    673:        return _NXAUDIO_ERR_PORT;
                    674: 
                    675:     if ([stream playBuffer:(void *)data size:count tag:tag
                    676:         replyTo:reply_port replyMsgs:messages])
                    677:        return _NXAUDIO_SUCCESS;
                    678:     else
                    679:        return _NXAUDIO_ERR_SIZE;
                    680: }
                    681: 
                    682: kern_return_t _NXAudioRecordStreamData(InputStream *stream, u_int count,
                    683:                                        int tag,
                    684:                                        port_t reply_port, u_int messages)
                    685: {
                    686:     xpr_audio_user("AU: recordStreamData\n", 0,0,0,0,0);
                    687:     if (!stream)
                    688:        return _NXAUDIO_ERR_PORT;
                    689: 
                    690:     if ([stream recordSize:count tag:tag
                    691:         replyTo:reply_port replyMsgs:messages])
                    692:        return _NXAUDIO_SUCCESS;
                    693:     else
                    694:        return _NXAUDIO_ERR_SIZE;
                    695: }
                    696: 
                    697: /*
                    698:  * Generic parameter api.
                    699:  */
                    700: 
                    701: kern_return_t _NXAudioGetDeviceName(AudioChannel *chan, audio_name_t name,
                    702:                                    u_int *count)
                    703: {
                    704:     if (!chan)
                    705:        return _NXAUDIO_ERR_PORT;
                    706:     strncpy(name, [[IOAudio _instance] name], _NXAUDIO_PARAM_MAX-1);
                    707:     name[_NXAUDIO_PARAM_MAX-1] = '\0';
                    708:     *count = strlen(name);
                    709:     return _NXAUDIO_SUCCESS;
                    710: }
                    711: 
                    712: kern_return_t _NXAudioSetDeviceParameters(AudioChannel *chan,
                    713:                                          port_t stream_owner,
                    714:                                          audio_array_t params, u_int count,
                    715:                                          audio_array_t values)
                    716: {
                    717:     xpr_audio_user("AU: setDevParams\n", 0,0,0,0,0);
                    718:     if (!chan)
                    719:        return _NXAUDIO_ERR_PORT;
                    720:     if (![chan checkOwner:stream_owner])
                    721:        return _NXAUDIO_ERR_NOT_OWNER;
                    722:     return ([[chan audioDevice] 
                    723:                _setParameters:(const NXSoundParameterTag *)params
                    724:                toValues:values count:count forObject:chan] ?
                    725:            _NXAUDIO_SUCCESS : _NXAUDIO_ERR_PARAMETER);
                    726: }
                    727: 
                    728: kern_return_t _NXAudioGetDeviceParameters(AudioChannel *chan,
                    729:                                          audio_array_t params, u_int count,
                    730:                                          audio_array_t values)
                    731: {
                    732:     xpr_audio_user("AU: getDevParams\n", 0,0,0,0,0);
                    733:     if (!chan)
                    734:        return _NXAUDIO_ERR_PORT;
                    735:     [[chan audioDevice] _getParameters:(const NXSoundParameterTag *)params
                    736:         values:values count:count forObject:chan];
                    737:     return _NXAUDIO_SUCCESS;
                    738: }
                    739: 
                    740: kern_return_t _NXAudioGetDeviceSupportedParameters(AudioChannel *chan,
                    741:                                                   audio_array_t params,
                    742:                                                   u_int *count)
                    743: {
                    744:     xpr_audio_user("AU: getDevSupParams\n", 0,0,0,0,0);
                    745:     *count = 0;
                    746:     if (!chan)
                    747:        return _NXAUDIO_ERR_PORT;
                    748:     [[chan audioDevice] _getSupportedParameters:
                    749:         (NXSoundParameterTag *)params
                    750:         count:count forObject:chan];
                    751:     return _NXAUDIO_SUCCESS;
                    752: }
                    753: 
                    754: kern_return_t _NXAudioGetDeviceParameterValues(AudioChannel *chan, int param,
                    755:                                               audio_array_t values,
                    756:                                               u_int *count)
                    757: {
                    758:     xpr_audio_user("AU: getDevParamValues\n", 0,0,0,0,0);
                    759:     *count = 0;
                    760:     if (!chan)
                    761:        return _NXAUDIO_ERR_PORT;
                    762:     return ([[chan audioDevice] _getValues:(NXSoundParameterTag *)values
                    763:                count:count forParameter:param forObject:chan] ?
                    764:            _NXAUDIO_SUCCESS : _NXAUDIO_ERR_PARAMETER);
                    765: }
                    766: 
                    767: kern_return_t _NXAudioGetSamplingRates(AudioChannel *chan,
                    768:                                       int *continuous,
                    769:                                       int *low, int *high,
                    770:                                       audio_array_t rates,
                    771:                                       u_int *count)
                    772: {
                    773:     xpr_audio_user("AU: getRates\n", 0,0,0,0,0);
                    774:     *count = 0;
                    775:     if (!chan)
                    776:        return _NXAUDIO_ERR_PORT;
                    777:     *continuous = [[chan audioDevice] acceptsContinuousSamplingRates];
                    778:     [[chan audioDevice] getSamplingRatesLow:low high:high];
                    779:     [[chan audioDevice] getSamplingRates:rates count:count];
                    780:     return _NXAUDIO_SUCCESS;
                    781: }
                    782: 
                    783: kern_return_t _NXAudioGetDataEncodings(AudioChannel *chan,
                    784:                                       audio_array_t encodings,
                    785:                                       u_int *count)
                    786: {
                    787:     xpr_audio_user("AU: getEncodings\n", 0,0,0,0,0);
                    788:     
                    789:     *count = 0;
                    790:     if (!chan)
                    791:        return _NXAUDIO_ERR_PORT;
                    792:     [[chan audioDevice]
                    793:         getDataEncodings:(NXSoundParameterTag *)encodings
                    794:         count:count];
                    795:     return _NXAUDIO_SUCCESS;
                    796: }
                    797: 
                    798: kern_return_t _NXAudioGetChannelCountLimit(AudioChannel *chan, u_int *count)
                    799: {
                    800:     xpr_audio_user("AU: getChans\n", 0,0,0,0,0);
                    801:     *count = 0;
                    802:     if (!chan)
                    803:        return _NXAUDIO_ERR_PORT;
                    804:     *count = [[chan audioDevice] channelCountLimit];
                    805:     return _NXAUDIO_SUCCESS;
                    806: }
                    807: 
                    808: kern_return_t _NXAudioSetStreamParameters(AudioStream *stream,
                    809:                                          audio_array_t params, u_int count,
                    810:                                          audio_array_t values)
                    811: {
                    812:     xpr_audio_user("AU: setStreamParams\n", 0,0,0,0,0);
                    813:     if (!stream)
                    814:        return _NXAUDIO_ERR_PORT;
                    815:     return ([[[stream channel] audioDevice]
                    816:                 _setParameters:(const NXSoundParameterTag *)params
                    817:                toValues:values count:count forObject:stream] ?
                    818:            _NXAUDIO_SUCCESS : _NXAUDIO_ERR_PARAMETER);
                    819: }
                    820: 
                    821: kern_return_t _NXAudioGetStreamParameters(AudioStream *stream,
                    822:                                          audio_array_t params, u_int count,
                    823:                                          audio_array_t values)
                    824: {
                    825:     xpr_audio_user("AU: getStreamParams\n", 0,0,0,0,0);
                    826:     if (!stream)
                    827:        return _NXAUDIO_ERR_PORT;
                    828: 
                    829:     [[[stream channel] audioDevice]
                    830:         _getParameters:(const NXSoundParameterTag *)params
                    831:        values:values count:count forObject:stream];
                    832:     return _NXAUDIO_SUCCESS;
                    833: }
                    834: 
                    835: kern_return_t _NXAudioGetStreamSupportedParameters(AudioStream *stream,
                    836:                                                   audio_array_t params,
                    837:                                                   u_int *count)
                    838: {
                    839:     xpr_audio_user("AU: getStreamSupParams\n", 0,0,0,0,0);
                    840:     *count = 0;
                    841:     if (!stream)
                    842:        return _NXAUDIO_ERR_PORT;
                    843:     [[[stream channel] audioDevice]
                    844:         _getSupportedParameters:(NXSoundParameterTag *)params
                    845:         count:count forObject:stream];
                    846:     return _NXAUDIO_SUCCESS;
                    847: }
                    848: 
                    849: kern_return_t _NXAudioGetStreamParameterValues(AudioStream *stream, int param,
                    850:                                               audio_array_t values,
                    851:                                               u_int *count)
                    852: {
                    853:     xpr_audio_user("AU: getStreamParamValues\n", 0,0,0,0,0);
                    854:     *count = 0;
                    855:     if (!stream)
                    856:        return _NXAUDIO_ERR_PORT;
                    857:     return ([[[stream channel] audioDevice]
                    858:                 _getValues:(NXSoundParameterTag *)values
                    859:                count:count forParameter:param forObject:stream] ?
                    860:            _NXAUDIO_SUCCESS : _NXAUDIO_ERR_PARAMETER);
                    861: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.