1/* 2 * OpenSound media addon for BeOS and Haiku 3 * 4 * Copyright (c) 2007, François Revol (revol@free.fr) 5 * Distributed under the terms of the MIT License. 6 */ 7 8#include "OpenSoundDeviceMixer.h" 9#include "debug.h" 10#include "driver_io.h" 11#include <MediaDefs.h> 12#include <Debug.h> 13#include <errno.h> 14#include <string.h> 15 16OpenSoundDeviceMixer::~OpenSoundDeviceMixer() 17{ 18 CALLED(); 19 if (fFD != 0) { 20 close(fFD); 21 } 22} 23 24OpenSoundDeviceMixer::OpenSoundDeviceMixer(oss_mixerinfo *info) 25{ 26 CALLED(); 27 fInitCheckStatus = B_NO_INIT; 28 memcpy(&fMixerInfo, info, sizeof(oss_mixerinfo)); 29 fFD = open(info->devnode, O_RDWR); 30 if (fFD < 0) { 31 fInitCheckStatus = errno; 32 return; 33 } 34 fInitCheckStatus = B_OK; 35} 36 37 38status_t OpenSoundDeviceMixer::InitCheck(void) const 39{ 40 CALLED(); 41 return fInitCheckStatus; 42} 43 44int OpenSoundDeviceMixer::CountExtInfos() 45{ 46 int n; 47 CALLED(); 48 49 // faster way! 50 return Info()->nrext; 51 52 // -1 doesn't work here (!?) 53 n = Info()->dev; 54 if (ioctl(fFD, SNDCTL_MIX_NREXT, &n, sizeof(int)) < 0) { 55 PRINT(("OpenSoundDeviceMixer::CountExtInfos: SNDCTL_MIX_NREXT: %s\n", strerror(errno))); 56 return 0; 57 } 58 59 return n; 60} 61 62 63 64status_t OpenSoundDeviceMixer::GetExtInfo(int index, oss_mixext *info) 65{ 66 CALLED(); 67 68 if (!info) 69 return EINVAL; 70 71 // XXX: we should probably cache them as they might change on the fly 72 73 info->dev = Info()->dev; // this mixer 74 info->ctrl = index; 75 if (ioctl(fFD, SNDCTL_MIX_EXTINFO, info, sizeof(*info)) < 0) { 76 PRINT(("OpenSoundDeviceMixer::%s: SNDCTL_MIX_EXTINFO(%d): %s\n", __FUNCTION__, index, strerror(errno))); 77 return errno; 78 } 79 80 return B_OK; 81} 82 83 84status_t OpenSoundDeviceMixer::GetMixerValue(oss_mixer_value *value) 85{ 86 CALLED(); 87 88 if (!value) 89 return EINVAL; 90 91 value->dev = Info()->dev; // this mixer 92 // should be set before calling 93 //value->ctrl = index; 94 //value->timestamp = 95 if (ioctl(fFD, SNDCTL_MIX_READ, value, sizeof(*value)) < 0) { 96 PRINT(("OpenSoundDeviceMixer::%s: SNDCTL_MIX_READ(%d): %s\n", __FUNCTION__, value->ctrl, strerror(errno))); 97 return errno; 98 } 99 100 return B_OK; 101} 102 103 104status_t OpenSoundDeviceMixer::SetMixerValue(oss_mixer_value *value) 105{ 106 CALLED(); 107 108 if (!value) 109 return EINVAL; 110 111 value->dev = Info()->dev; // this mixer 112 // should be set before calling 113 //value->ctrl = index; 114 //value->timestamp = 115 if (ioctl(fFD, SNDCTL_MIX_WRITE, value, sizeof(*value)) < 0) { 116 PRINT(("OpenSoundDeviceMixer::%s: SNDCTL_MIX_WRITE(%d): %s\n", __FUNCTION__, value->ctrl, strerror(errno))); 117 return errno; 118 } 119 120 return B_OK; 121} 122 123 124status_t OpenSoundDeviceMixer::GetEnumInfo(int index, oss_mixer_enuminfo *info) 125{ 126 CALLED(); 127 128 if (!info) 129 return EINVAL; 130 131 info->dev = Info()->dev; // this mixer 132 info->ctrl = index; 133 if (ioctl(fFD, SNDCTL_MIX_ENUMINFO, info, sizeof(*info)) < 0) { 134 PRINT(("OpenSoundDeviceMixer::%s: SNDCTL_MIX_ENUMINFO(%d): %s\n", __FUNCTION__, index, strerror(errno))); 135 return errno; 136 } 137 138 return B_OK; 139} 140 141 142//update_counter 143 144 145