0

ALSA と C を使用して現在のオーディオ ピーク値を取得しようとしています。この値を 0.0 から 1.0 (または 0 から 100) の間のスカラーとして取得することをお勧めします。Windows では、非常に基本的な VU メーターを作成できるIAudioMeterInformationを使用します。

編集:マイクではなく、スピーカー出力のみを検出することを指しています。

4

2 に答える 2

1

以下の例snd_pcm_readiを参照してください。

static float GetLevel (void)
{
    float result = 0.0f;
    snd_pcm_t* waveform;

    // Open and initialize a waveform
    if (snd_pcm_open (&waveform, "default",
        SND_PCM_STREAM_CAPTURE, 0) != 0)
        return 0;

    // Set the hardware parameters
    if (!snd_pcm_set_params (waveform, SND_PCM_FORMAT_S16_LE,
        SND_PCM_ACCESS_RW_INTERLEAVED, 2, 48000, 1, 0))
    {
        // Read current samples
        short buffer[256];
        if (snd_pcm_readi (waveform, buffer, 128) == 128)
        {
            // Compute the maximum peak value
            for (int i = 0; i < 256; ++i)
            {
                // Substitute better algorithm here if needed
                float s = buffer[i] / 32768.0f;
                if (s < 0) s *= -1;
                if (result < s) result = s;
            }
        }
    }

    snd_pcm_close (waveform);
    return result;
}

しかし、これが良い解決策であるかどうかについては懐疑的です。

于 2013-09-05T02:22:15.177 に答える