Интерфейс для изменения громкости и воспроизведения звука для устройства HDA Audio под Windows CE 6.0?

Я разрабатываю приложения C # .Net CF для устройства Win CE, и у меня возникают проблемы с изменением громкости динамика, чтобы повлиять на фактическую громкость при воспроизведении звука.

Я использую следующий интерфейс:

int waveOutSetVolume(IntPtr hMod, UInt32 dwVolume);
int PlaySound(string szSound, IntPtr hMod, int flags);

Код, который я использую, хорошо работал с нашим старым устройством, у которого были следующие настройки:

  • Аудиокодек AC'97, Windows CE 5, .Net CF 2.0.

Однако на новом устройстве звук воспроизводится, но я не могу изменить громкость. Настройка выглядит следующим образом:

  • Аудиокодек HDA, Windows CE 6, .Net CF 3.5.

Я не уверен, связана ли эта проблема с образом ОС Windows CE 6 (например, отсутствует / неправильный аудиодрайвер), или я использую неправильный интерфейс в моем коде C #.

Любая помощь и идеи приветствуются!

Спасибо,

Карл

Дополнительные детали:

Код:

    public unsafe int SetVolume(int newVolumeInPercent)
    {
        UInt32 newVol = (UInt32)((double)(newVolumeInPercent * ushort.MaxValue) / 100.0);
        newVol = newVol + (newVol << 16);

        int resultSetVolume = waveOutSetVolume(IntPtr.Zero, newVol);

        return (int)Math.Round((double)resultSetVolume * 100 / ushort.MaxValue);
    }

    public void playSound(string soundFile)
    {
        PlaySound(soundFile, IntPtr.Zero, (int)(Flags.SND_ASYNC | Flags.SND_FILENAME));
    }

    [DllImport("CoreDll.dll")]
    private extern static int waveOutSetVolume(IntPtr hMod, UInt32 dwVolume);

    [DllImport("CoreDll.dll", EntryPoint = "PlaySound", SetLastError = true)]
    private extern static int PlaySound(string szSound, IntPtr hMod, int flags);

    private enum Flags
    {
        SND_ASYNC = 0x0001,
        SND_FILENAME = 0x00020000,
    }

Как вы видите в коде, я использую процентную громкость аргумента как для левого, так и для правого канала.

Используя Windows CE Remote Process Viewer, я вижу, что аудиодрайвер (например, "jwavehda.dll") загружен. Также загружается "waveapi.dll" (общий API Window wave?).

Я слышу звук при нажатии на экран, и с помощью функции «PlaySound» я могу воспроизвести волновой файл. Проблема только в том, что я не могу повлиять на громкость.

Спасибо!


person Karl_Swe    schedule 28.06.2011    source источник


Ответы (1)


Мне нужно увидеть ваш вызывающий код (и ваше объявление p / invoke здесь также неполное), чтобы быть уверенным. Знаете ли вы, что waveOutSetVolume dwVolume разделен на два слова, верхняя работа - это громкость левого канала, а нижняя работа - громкость правого канала? Значение, которое вы отправляете, может влиять на поведение (вы не показали эту часть вашего кода).

Тот факт, что код работал на одной платформе, но не работает на другой, указывает мне, что это, вероятно, проблема ОС / платформы. Вы получаете звук для таких вещей, как касание экрана или другие системные события? У вас есть апплет панели управления звуком? Вы искали аудиодрайвер в реестре, чтобы убедиться, что он существует в ОС и также загружен?

person ctacke    schedule 28.06.2011
comment
Спасибо за Ваш ответ. Я добавил подробности к проблеме выше. - person Karl_Swe; 29.06.2011