Интерфейс для изменения громкости и воспроизведения звука для устройства HDA Audio под Windows CE 6.0? - PullRequest
1 голос
/ 28 июня 2011

Я разрабатываю приложения 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 #.

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

Спасибо

Karl

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

Код:

    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" (универсальный интерфейс Window wave api?).

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

Спасибо!

1 Ответ

0 голосов
/ 28 июня 2011

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

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

...