989 static PyObject *
990 alsamixer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
991 {
992 alsamixer_t *self;
993 int err;
994 int cardindex = 0;
995 char *control = "Master";
996 int id = 0;
997 snd_mixer_elem_t *elem;
998 int channel;
999 char *kw[] = { "control", "id", "cardindex", NULL };
1000
1001 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|sii", kw,
when PyArg_ParseTupleAndKeywords() succeeds
taking False path
1002 &control, &id, &cardindex))
1003 return NULL;
1004
1005 if (!(self = (alsamixer_t *)PyObject_New(alsamixer_t, &ALSAMixerType)))
when _PyObject_New() succeeds
taking False path
_PyObject_New allocated at: if (!(self = (alsamixer_t *)PyObject_New(alsamixer_t, &ALSAMixerType)))
ob_refcnt is now refs: 1 + N where N >= 0
1006 return NULL;
1007
1008 self->handle = 0;
1009 self->cardname = translate_cardidx(cardindex);
1010
1011 err = alsamixer_gethandle(self->cardname, &self->handle);
1012 if (err<0)
when considering range: -0x80000000 <= value <= -1
taking True path
1013 {
1014 PyErr_SetString(ALSAAudioError,snd_strerror(err));
calling PyErr_SetString()
1015 free(self->cardname);
1016 return NULL;
1017 }
1018
1019 self->controlname = strdup(control);
1020 self->controlid = id;
1021
1022 elem = alsamixer_find_elem(self->handle,control,id);
1023 if (!elem)
1024 {
1025 char errtext[128];
1026 sprintf(errtext,"Unable to find mixer control '%s',%i",
1027 self->controlname,
1028 self->controlid);
1029 snd_mixer_close(self->handle);
1030 PyErr_SetString(ALSAAudioError,errtext);
1031 return NULL;
1032 }
1033 /* Determine mixer capabilities */
1034 self->volume_cap = self->switch_cap = 0;
1035 if (snd_mixer_selem_has_common_volume(elem))
1036 {
1037 self->volume_cap |= MIXER_CAP_VOLUME;
1038 if (snd_mixer_selem_has_playback_volume_joined(elem))
1039 self->volume_cap |= MIXER_CAP_VOLUME_JOINED;
1040 }
1041 else
1042 {
1043 if (snd_mixer_selem_has_playback_volume(elem))
1044 {
1045 self->volume_cap |= MIXER_CAP_PVOLUME;
1046 if (snd_mixer_selem_has_playback_volume_joined(elem))
1047 self->volume_cap |= MIXER_CAP_PVOLUME_JOINED;
1048 }
1049 if (snd_mixer_selem_has_capture_volume(elem))
1050 {
1051 self->volume_cap |= MIXER_CAP_CVOLUME;
1052 if (snd_mixer_selem_has_capture_volume_joined(elem))
1053 self->volume_cap |= MIXER_CAP_CVOLUME_JOINED;
1054 }
1055 }
1056
1057 if (snd_mixer_selem_has_common_switch(elem))
1058 {
1059 self->switch_cap |= MIXER_CAP_SWITCH;
1060 if (snd_mixer_selem_has_playback_switch_joined(elem))
1061 self->switch_cap |= MIXER_CAP_SWITCH_JOINED;
1062 }
1063 else
1064 {
1065 if (snd_mixer_selem_has_playback_switch(elem)) {
1066 self->switch_cap |= MIXER_CAP_PSWITCH;
1067 if (snd_mixer_selem_has_playback_switch_joined(elem))
1068 self->switch_cap |= MIXER_CAP_PSWITCH_JOINED;
1069 }
1070 if (snd_mixer_selem_has_capture_switch(elem)) {
1071 self->switch_cap |= MIXER_CAP_CSWITCH;
1072 if (snd_mixer_selem_has_capture_switch_joined(elem))
1073 self->switch_cap |= MIXER_CAP_CSWITCH_JOINED;
1074 if (snd_mixer_selem_has_capture_switch_exclusive(elem))
1075 self->switch_cap |= MIXER_CAP_CSWITCH_EXCLUSIVE;
1076 }
1077 }
1078 self->pchannels = 0;
1079 if (self->volume_cap | MIXER_CAP_PVOLUME ||
1080 self->switch_cap | MIXER_CAP_PSWITCH)
1081 {
1082 if (snd_mixer_selem_is_playback_mono(elem)) self->pchannels = 1;
1083 else {
1084 for (channel=0; channel <= SND_MIXER_SCHN_LAST; channel++) {
1085 if (snd_mixer_selem_has_playback_channel(elem, channel))
1086 self->pchannels++;
1087 else break;
1088 }
1089 }
1090 }
1091 self->cchannels = 0;
1092 if (self->volume_cap | MIXER_CAP_CVOLUME ||
1093 self->switch_cap | MIXER_CAP_CSWITCH)
1094 {
1095 if (snd_mixer_selem_is_capture_mono(elem))
1096 self->cchannels = 1;
1097 else
1098 {
1099 for (channel=0; channel <= SND_MIXER_SCHN_LAST; channel++) {
1100 if (snd_mixer_selem_has_capture_channel(elem, channel))
1101 self->cchannels++;
1102 else break;
1103 }
1104 }
1105 }
1106 snd_mixer_selem_get_playback_volume_range(elem, &self->pmin, &self->pmax);
1107 snd_mixer_selem_get_capture_volume_range(elem, &self->cmin, &self->cmax);
1108
1109 return (PyObject *)self;
1110 }
ob_refcnt of '*self' is 1 too high
was expecting final ob_refcnt to be N + 0 (for some unknown N)
but final ob_refcnt is N + 1