Freigeben über


Для ценителей музыкальных шедевров на смартфонах

Автор: Клинт Раткэс (Clint Rutkas): twitter, блог

Загрузки: https://peacelovecode.com/code/cowbell/cowbell.zip

ПО:

Visual Studio 2008 Standard или старше (пробная версия)
Windows Mobile 6.0 SDK
Windows Mobile 6.1 Emulator Images (необязательно)

Оборудование: Windows Mobile Pro (необязательно)

Необходимое время: 2 часа

Затраты: Нулевые

Как известно, самый сложный музыкальный инструмент — это колокольчик, который привязывают коровам, чтоб они не потерялись. Именно его неземные звуки я решил реализовать в своем телефоне HTC Touch Diamond.

Приложение получилось достаточно понятное и простое. Оно позволяет изменять громкость телефона, обеспечивает ввод с сенсорного экрана, а также может служить демонстрацией развертывания приложения Windows Mobile. Кроме того, производится масштабирование изображения в соответствии с пропорциями экрана, но для реализации этой функции использовался существующий код.

Вы увидите, что применение эмулятора может потребовать некоторых дополнительных действий, а код в этом случае напоминает типичное Windows-приложение.

Приведенного в публикации исходного кода недостаточно для работы программы, вам надо загрузить исходный текст по ссылке, указанной в начале поста.

Первые шагиimage

Установив и запустив Visual Studio 2008, вам надо будет загрузить и инсталлировать Windows Mobile 6.0 SDK, если его у вас нет (ссылка приведена в начале публикации).Visual Studio 2008 поставляется с версией 5.0 Windows mobile SDK.

Справа вы видите изображение эмулятора с одной из стилизованных форм. Но вы можете не только запускать свою программу на эмуляторе, но и устанавливать ее прямо на свой смартфон. Прямое развертывание допускается в режиме Windows Mobile Professional, что же касается Windows Mobile Standard (без поддержки сенсорного экрана), в этом режиме требуется несколько дополнительных шагов. Описание этих шагов приведено в моем блоге. После того как телефон корректно настроен, вам потребуется лишь изменить целевое устройство для установки.

На снимке экрана я выделил установку на устройстве, а не на эмуляторе.

Создание устройства

Для создания нового решения выберите меню File –> New –> Project (Файл –> Создать –> Проект). Мы выбрали проект «Smart Device» (Смарт-устройство) на языке С#.image

Пока все просто, не правда ли? Теперь выберем инфраструктуру (.NET Framework 3.5) и целевую платформу. Выберите «Windows Mobile 6 Professional SDK» и щелкните OK, чтоб приступить к работе.image

Изменение громкости

Для изменения громкости при работе с Сompact Framework сейчас приходится обращаться к некоторым вызовам Windows API посредством PInvoke. Не пугайтесь — это не страшно. На сайте pinvoke.net есть все, что делает эти вызовы проще простого. Мы создадим класс Audio и поместим в него все функции, связанные со звуком. К ним относятся проигрывание аудио-файла и изменение громкости. Для начала реализуем возможность проигрывания звукового файла. Поскольку мы будем получать наши данные из ресурсов, мы воспользуемся объектом MemoryStream для преобразования последовательности байтов в поток. Нам понадобится пространство имен System.Media. Для работы с PInvoke мы добавим еще System.Runtime.InteropServices .

    1: private readonly SoundPlayer sp;
    2:  
    3:     public Audio(byte[] AudioResource)
    4:     {
    5:         sp = new SoundPlayer(new MemoryStream(AudioResource));
    6:         sp.Load();
    7:     }
    8:  
    9:     public void Play()
   10:     {
   11:         sp.Play();
   12:     }
   13:  
   14:     public void PlayLoop()
   15:     {
   16:         sp.PlayLooping();
   17:     }
   18:  
   19:     public void Stop()
   20:     {
   21:         sp.Stop();
   22:     }

В нашем приложении обращение к аудио-файлу будет выглядеть так:

    1: private readonly Audio audio = new Audio(Properties.Resources.CowBellAudio);

Теперь задействуем PInvoke для изменения громкости. Должен признаться, что я не разобрался, почему применяются именно такие значения для громкости — я просто взял эту информацию в Интернете. В идеале хотелось бы видеть что-нибудь вроде значений от 0 до 100, но приходится использовать то, что есть. Создадим методы get/set, чтобы скрыть вызовы PInvoke.

    1: [DllImport("coredll.dll")]
    2: private static extern int waveOutGetVolume(IntPtr hwo, out uint dwVolume);
    3:  
    4: [DllImport("coredll.dll")]
    5: private static extern int waveOutSetVolume(IntPtr hwo, uint dwVolume);
    6:  
    7: public static uint Volume
    8: {
    9:     get
   10:     {
   11:         uint _volume;
   12:         waveOutGetVolume(IntPtr.Zero, out _volume);
   13:         return _volume;
   14:     }
   15:  
   16:     set
   17:     {
   18:         waveOutSetVolume(IntPtr.Zero, value);
   19:     }
   20: }
   21:  
   22: public enum Volumes
   23: {
   24:     OFF = 0,
   25:     LOW = 858993459,
   26:     NORMAL = 1717986918,
   27:     MEDIUM = -1717986919,
   28:     HIGH = -858993460,
   29:     VERY_HIGH = -1
   30: }

Создаем колокольчик

Симпатичные картинки и приятные звуки

Раз уж нас приложение с колокольчиком — нужен настоящий колокольчик. Я нашел картинку в Интернете, а также значок с изображением колокольчика на странице Famfamfam Silk.

Мы внедрим эти изображения в приложение, чтобы облегчить его развертывание. Для этого нам потребуется ресурс на вкладке свойств проекта. Выберите меню Project->Properties ( Проект->Свойства) или щелкните правой кнопкой проект и выберите в контекстном меню Properties (Свойства).

Здесь нам потребуются разделы Images (Изображения) и Audio (Звук).

image

Выделив нужный раздел, щелкните кнопку Add Resource (Добавить ресурс) и выберите нужный файл. Ссылаться на эти ресурсы весьма просто, но выглядит это по-разному в зависимости от языка.

    1: Properties.Resources.cowBellImage;

Проще некуда!

Элементы формы

Чтобы изображение колокольчика было максимальным, мы отключим некоторые элементы формы. Установим WindowState в Maximum, TopMost в True, MinimizeBox в False и FormBorder в None.

Перетащим на форму два поля рисунков и назовем их picCowbell и picClose. Фон обоих полей установим прозрачным. Чтобы привязать события Click к полям рисунков, дважды щелкнем на каждом из них. Для элемента picClose мы добавим метод Close() , чтобы закрывать приложение щелчком этого изображения.

Также добавим событие MouseDown для picCowbell. Здесь мы зададим громкость и включим воспроизведение. Объект Audio порождается при создании формы, следовательно, он уже загружен в память при отображении формы и создается лишь единожды.

    1: private readonly Audio audio = new Audio(Properties.Resources.CowBellAudio);
    2: private void picCowbell_MouseDown(object sender, MouseEventArgs e)
    3: {
    4:     Audio.Volumes value;
    5:     switch ((int)Math.Round((e.Y / (Height * 1.0)) * 5))
    6:     {
    7:         //case 0: // по умолчанию;
    8:         //case 1:
    9:         default:
   10:             value = Audio.Volumes.LOW;
   11:             break;
   12:         case 2:
   13:             value = Audio.Volumes.NORMAL;
   14:             break;
   15:         case 3:
   16:             value = Audio.Volumes.MEDIUM;
   17:             break;
   18:         case 4:
   19:             value = Audio.Volumes.HIGH;
   20:             break;
   21:         case 5:
   22:             value = Audio.Volumes.VERY_HIGH;
   23:             break;
   24:     }
   25:  
   26:     // Чтобы не снижать производительность, изменяем громкость
   27:     // только если изменились значения
   28:     if( oldValue != value)
   29:     {
   30:         Audio.Volume = (uint) value;
   31:         oldValue = value;
   32:     }
   33:     audio.Play();
   34: }

Создание CAB-файла для установки

Можно щелкнуть правой кнопкой решение в обозревателе или выбрать меню File->New->Project (Файл->Создать->Проект). Если вы выберите меню, вы увидите картинку немного отличающуюся от моей. Внизу будет выпадающее меню, в котором вы сможете выбрать пункт «Add to Solution» (Добавить в решение) вместо «Create new solution» (Создать новое решение).

image

Поскольку я остановился на установке из CAB-файла, я выбрал «Other Project Types» (Другие типы проектов), а затем «Setup and Deployment» (Проект установки и развертывания) и «Smart Device CAB Project» (CAB-проект для интеллектуального устройства).

Теперь щелкните правой кнопкой «Application Folder» (Папка приложения) и выберите «Add» (Создать). Выберите «Primary Output» (Основные выходные файлы) и щелкните OK.

image

Теперь в окне «File System» (Файловая система) щелкните правой кнопкой «File System on Target Machine» (Файловая система на конечном компьютере) и перейдите к «Add Special Folder» (Добавить специальную папку) и выберите «Start Menu Folder» (Папка меню «Пуск»).

Теперь вернемся к «Application Menu» (Меню приложения) и щелкнем правой кнопкой «Primary output from Cowbell» (Основные выходные файлы Cowbell). Выберите «Create Shortcut» (Создать ярлык) и перетащите этот ярлык в свою папку меню «Пуск». Советую его переименовать.

Теперь можете построить решение, перетащить CAB-файл на устройство и установить приложение.

Завершение

Загрузить весь исходный код приложения можно здесь: https://peacelovecode.com/code/cowbell/cowbell.zip

Об авторе

Клинт Раткэс работает в Майкрософт. Он автор таких интересных проектов, как Disco Dance Floor (дискотечный танцпол), автоматический бармен и самобалансирующийся скейтборд. В своем блоге https://BetterThanEveryone.com он рассказывает о той безумной идее, над которой работает в текущий момент.

Comments