int audriv_get_play_volume(void) /* 演奏音量を 0 〜 255 内で得ます.0 は無音,255 は最大音量. * 失敗すると -1 を返し,そうでない場合は 0 〜 255 内の音量を返します. */ { #ifndef SGI_OLDAL ALfixed lrgain[2]; ALpv pv; double gain, l, r, min, max; int volume; int resource; min = alFixedToDouble(out_ginfo.min.ll); max = alFixedToDouble(out_ginfo.max.ll); pv.param = AL_GAIN; pv.value.ptr = lrgain; pv.sizeIn = 2; if(out == NULL) resource = AL_DEFAULT_OUTPUT; else resource = alGetResource(out); if(alGetParams(resource, &pv, 1) < 0) { audriv_err(ALERROR); return -1; } l = alFixedToDouble(lrgain[0]); r = alFixedToDouble(lrgain[1]); if(l < min) l = min; else if(l > max) l = max; if(r < min) r = min; else if(r > max) r = max; gain = (l + r) / 2; volume = (gain - min) * 256 / (max - min); if(volume < 0) volume = 0; else if(volume > 255) volume = 255; return volume; #else long gain[4]; int volume; gain[0] = AL_LEFT_SPEAKER_GAIN; gain[2] = AL_RIGHT_SPEAKER_GAIN; if(ALgetparams(AL_DEFAULT_DEVICE, gain, 4) < 0) { audriv_err(ALERROR); return -1; } volume = (gain[1] + gain[3]) / 2; if(volume < 0) volume = 0; else if(volume > 255) volume = 255; return volume; #endif /* SGI_OLDAL */ }
Bool audriv_set_play_sample_rate(long sample_rate) /* audio 演奏時のサンプルレートを指定します. * 成功した場合は True を,失敗した場合は False を返します. */ { #if 0 int i, n; const long *r; r = audriv_available_sample_rates(&n); for(i = 0; i < n; i++) if(r[i] == sample_rate) break; if(i == n) return False; #endif if(sample_rate == play_sample_rate) return True; play_sample_rate = sample_rate; if(out) { if(audriv_al_set_rate(out, sample_rate) == False) { audriv_err(ALERROR); return False; } } return True; }
Bool audriv_setup_audio(void) /* オーディオの初期化を行います. * 成功した場合は True を,失敗した場合は False を返します. */ { if(out_config) return True; if((out_config = alNewConfig()) == NULL) { audriv_err(ALERROR); return False; } out = NULL; #ifndef SGI_OLDAL if(alGetParamInfo(AL_DEFAULT_OUTPUT, AL_GAIN, &out_ginfo) < 0) { audriv_err(ALERROR); alFreeConfig(out_config); out_config = NULL; return False; } #endif /* SGI_OLDAL */ if(alSetSampFmt(out_config, AL_SAMPFMT_TWOSCOMP) < 0) { audriv_err(ALERROR); return False; } #if 0 if(alSetQueueSize(out_config, OUT_AUDIO_QUEUE_SIZE) != 0) { fprintf(stderr, "Warning: Can't set queue size: %d\n", OUT_AUDIO_QUEUE_SIZE); } #else alSetQueueSize(out_config, OUT_AUDIO_QUEUE_SIZE); #endif return True; }
Bool audriv_play_open(void) /* audio を演奏用に開き,いつでも audriv_write() により演奏可能な * 状態にします.既に開いている場合はなにも行いません. * 成功した場合は True を,失敗した場合は False を返します. */ { if(out) return True; if(audriv_al_set_width(out_config, play_encoding) < 0) { audriv_err(ALERROR); return False; } alSetChannels(out_config, play_nchannels); out = alOpenPort("audriv", "w", out_config); if(!out) { audriv_err(ALERROR); return False; } if(audriv_al_set_rate(out, play_sample_rate) == False) { audriv_err(ALERROR); alClosePort(out); out = NULL; return False; } alSetConfig(out, out_config); reset_samples = 0; play_counter = 0; return True; }
Bool audriv_set_play_output(int port) /* audio の出力先 port を指定します.port には以下のどれかを指定します. * * AUDRIV_OUTPUT_SPEAKER スピーカに出力. * AUDRIV_OUTPUT_HEADPHONE ヘッドホンに出力. * AUDRIV_OUTPUT_LINE_OUT ラインアウトに出力. * * 成功した場合は True を,失敗した場合は False を返します. */ { if(port != AUDRIV_OUTPUT_SPEAKER) { audriv_err("指定外の出力ポートが指定されました."); return False; } return True; }
Bool audriv_set_play_output(int port) /* audio の出力先 port を指定します.port には以下のどれかを指定します. * * AUDRIV_OUTPUT_SPEAKER スピーカに出力. * AUDRIV_OUTPUT_HEADPHONE ヘッドホンに出力. * AUDRIV_OUTPUT_LINE_OUT ラインアウトに出力. * * 成功した場合は True を,失敗した場合は False を返します. */ { switch(port) { case AUDRIV_OUTPUT_SPEAKER: case AUDRIV_OUTPUT_HEADPHONE: case AUDRIV_OUTPUT_LINE_OUT: output_port = port; break; default: audriv_err("指定外の出力ポートが指定されました."); return False; } return True; }
Bool audriv_set_play_volume(int volume) /* 演奏音量を 0 〜 255 の範囲内で設定します.0 は無音,255 は最大音量. * 0 未満は 0,255 を超える値は 255 に等価. * 成功した場合は True を,失敗した場合は False を返します. */ { #ifndef SGI_OLDAL double gain; ALfixed lrgain[2]; ALpv pv; int resource; if(volume < 0) volume = 0; else if(volume > 255) volume = 255; if(volume == 0) { if(out_ginfo.specialVals & AL_NEG_INFINITY_BIT) gain = alFixedToDouble(AL_NEG_INFINITY); else gain = alFixedToDouble(out_ginfo.min.ll); } else if(volume == 255) { gain = alFixedToDouble(out_ginfo.max.ll); } else { double min, max; min = alFixedToDouble(out_ginfo.min.ll); max = alFixedToDouble(out_ginfo.max.ll); gain = min + (max - min) * (volume - 1) * (1.0/255); if(gain < min) gain = min; else if(gain > max) gain = max; } if(out == NULL) resource = AL_DEFAULT_OUTPUT; else resource = alGetResource(out); lrgain[0] = lrgain[1] = alDoubleToFixed(gain); pv.param = AL_GAIN; pv.value.ptr = lrgain; pv.sizeIn = 2; if(alSetParams(resource, &pv, 1) < 0) { audriv_err(ALERROR); return False; } return True; #else long gain[4]; if(volume < 0) volume = 0; else if(volume > 255) volume = 255; gain[0] = AL_LEFT_SPEAKER_GAIN; gain[1] = volume; gain[2] = AL_RIGHT_SPEAKER_GAIN; gain[3] = volume; if(ALsetparams(AL_DEFAULT_DEVICE, gain, 4) < 0) { audriv_err(ALERROR); return False; } return True; #endif /* SGI_OLDAL */ }