Для ценителей музыкальных шедевров на смартфонах
Автор: Клинт Раткэс (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-приложение.
Приведенного в публикации исходного кода недостаточно для работы программы, вам надо загрузить исходный текст по ссылке, указанной в начале поста.
Первые шаги
Установив и запустив 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» (Смарт-устройство) на языке С#.
Пока все просто, не правда ли? Теперь выберем инфраструктуру (.NET Framework 3.5) и целевую платформу. Выберите «Windows Mobile 6 Professional SDK» и щелкните OK, чтоб приступить к работе.
Изменение громкости
Для изменения громкости при работе с С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 (Звук).
Выделив нужный раздел, щелкните кнопку 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» (Создать новое решение).
Поскольку я остановился на установке из CAB-файла, я выбрал «Other Project Types» (Другие типы проектов), а затем «Setup and Deployment» (Проект установки и развертывания) и «Smart Device CAB Project» (CAB-проект для интеллектуального устройства).
Теперь щелкните правой кнопкой «Application Folder» (Папка приложения) и выберите «Add» (Создать). Выберите «Primary Output» (Основные выходные файлы) и щелкните OK.
Теперь в окне «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
- Anonymous
April 04, 2009
Неплохо бы указывать ссылку-первоисточник статьи на английском языке. В данном случае http://blogs.msdn.com/coding4fun/archive/2008/11/10/9059259.aspx