Hatena::ブログ(Diary)

酢ろぐ(ch3cooh.jp) RSSフィード


CH3COOH(酢酸)の実験室
Baseball Japan / ○○時計 for WP7 / for WM
Windows Phone 7 開発 Tips

2012-06-01

Windows 8 Release PreviewにWindows Phone SDK 7.1(7.1.1)をインストールする方法

この記事は、2012/6/1現在にリリースされている最新の「Windows 8 Release Preview(Build 8400)」、「Windows Phone SDK 7.1」及び「Windows Phone SDK 7.1.1 更新プログラム」を利用しております。「Windows 8 Release Preview」は開発中のものであり、「Windows Phone SDK 7.1」が正式にサポートするOSでないことにご留意ください。

大西さんのブログで言及されているので既にご存知の方が多いのかと思っていたのですが、意外と詰まっている方が多いので改めて書いておきます。

VS2012でWP7アプリ開発をすることはできません

2012/6/1現在、Visual Studio 2012 RCを使ってWindows Phone 7アプリケーションの開発をすることができません*1ので、Visual Studio 2012 RCとVisual Studio 2010を共存させる必要があります。

ここでは、Windows 8 Release Previewに対してWindows Phone SDK 7.1(7.1.1)をインストールする方法についてご紹介します。

続きを読む

*1:ただ、今のところVS2010でWindows Mobileアプリ開発を切ったように、サポートを打ち切りという宣言はされていないので、今後VS2012でWP7アプリが開発できるようになる可能性はあります

2012-05-29

もうIS12Tのケースが100円になるのかぁ……

この前発売したばかりのようにも思えますが、ヤマダ電機でIS12Tのケースが100円になっていました。

f:id:ch3cooh393:20120529234734j:image

2012-05-28

iPhone、AndroidからWindows Phone 7、Metro スタイル アプリに移植するときに読む記事

僕は、Windows Phone 7だったりiOSだったり、ほんのほんの少しだけAndroidアプリの開発をしています。お仕事で開発する場合のWindows Phone 7アプリAndroidアプリはほとんどiOSアプリからの移植であることがほとんどです。

ロジック部分に関しては言語が異なるもののアルゴリズム自体は変わることは少ないのですが、ことUI部分に関しては各プラットフォームによって大きく事情が異なります。

日本市場においてはWindows Phone 7への移植の案件はほとんど聞かなくなりましたが、これからきたるMetro スタイル アプリに関してはぽつぽつと案件のお話を聞きます。各プラットフォームのアプリからそんなWindows Phone 7とMetro スタイル アプリに移植する際に読むべき記事をまとめてみました。

Metro スタイル アプリへ移植するときに読む記事

iOS(iPad) to Metro Style Apps
ウェブアプリ/ウェブサイト to Metro Style Apps
Windows Phone to Metro Style Apps

Windows Phoneへ移植するときに読む記事

ウェブアプリ/ウェブサイト to Windows Phone
iOS(iPhone) to Windows Phone
Android to Windows Phone

Symbian to Windows Phone

参考

2012-05-21

iTunesとiPhone(iPad/iPod)間でデータ共有する

info.plistに「UIFileSharingEnabled」を追加して、値をYESにするだけです。

AVAudioPlayerを使って再生する際の音量を取得/設定する

AVAudioPlayerクラスを使用して音を鳴らす方法は「AVaudioPlayerで音を鳴らす」でご紹介しています。

鳴らす処理の延長線上となる音量の取得/設定の方法についてご紹介したいと思います。

// 楽曲ファイルのパスからAudioPlayerオブジェクトを作成
NSString* path = path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"wav"];
NSURL* url = [NSURL fileURLWithPath:path];
AVAudioPlayer* player= [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];

// AVAudioPlayerオブジェクトのボリュームは0.0〜1.0の間で指定する
player.volume *= 0.5;

蛇足1

AudioServicesCreateSystemSoundID/AudioServicesPlaySystemSoundで音を鳴らすときの、音量調整の仕方が分かりません。非公開APIを使用すれば調整出来るとのことですが、基本的には音量調整はできないと考えた方が良さそうです。

蛇足2

使い道を把握していないので蛇足ですが、MPMusicPlayerControllerクラスの音量を取得する場合のコードをご紹介します。

MediaPlayer.frameworkをリンクするとiPodライブラリを参照するMPMusicPlayerControllerクラスが使用できるようになります。

MPMusicPlayerController *iPod = [MPMusicPlayerController iPodMusicPlayer]; 
float volumeLevel1 = iPod.volume;
    
MPMusicPlayerController *appMP = [MPMusicPlayerController applicationMusicPlayer];
float volumeLevel2 = appMP.volume;

MPMusicPlayerController#iPodMusicPlayerメソッドで取得したオブジェクトのvolumeプロパティiPodライブラリから選択した楽曲やビデオの生成時の音量だとして、MPMusicPlayerController#applicationMusicPlayerメソッドで取得した音量は何の音量なのかよくわかりません。

AudioServicesCreateSystemSoundID/AudioServicesPlaySystemSoundで音を鳴らす

AudioServicesCreateSystemSoundID関数を使用する場合は、importディレクティブに以下の宣言が必要になります。

#import <AVFoundation/AVFoundation.h>

バイナリ内に含まれる楽曲ファイルを再生させる場合のサンプルコードを以下に示します。

// 楽曲ファイルのパスからNSURLオブジェクトを作成する
NSString* path = path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"wav"];
NSURL* url = [NSURL fileURLWithPath:path];

// サウンドIDを取得する
SystemSoundID soundID;
AudioServicesCreateSystemSoundID((CFURLRef)url, &soundID)

// 音声ファイルの再生をおこなう
AudioServicesPlaySystemSound(soundID);

// 読み込み済みのサウンドリソースを解放する
AudioServicesDisposeSystemSoundID(soundID);

AVaudioPlayerで音を鳴らす

AVAudioPlayerクラスを使用する場合は、importディレクティブに以下の宣言が必要になります。

#import <AVFoundation/AVFoundation.h>

バイナリ内に含まれる楽曲ファイルを再生させる場合のサンプルコードを以下に示します。

// 楽曲ファイルのパスからAudioPlayerオブジェクトを作成
NSString* path = path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"wav"];
NSURL* url = [NSURL fileURLWithPath:path];
AVAudioPlayer *player= [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];

// playが呼び出されてからすぐに音を鳴らすことが出来る様に
// あらかじめファイルの読み込みをおこない、バッファに保持しておく
[player prepareToPlay]

// 音声ファイルの再生をおこなう
[player play];

楽曲ファイルをBGM的に使用したい場合は、再生前に再生回数(numberOfLoopsプロパティ)を無限に設定します。0より小さいの値を設定すれば楽曲を無限ループで再生させます。

// 無限ループで再生させたい場合
[player setNumberOfLoops:-1];

// 3回再生させたい場合
[player setNumberOfLoops:2];

2012-05-17

NSDictionaryクラスのobjectEnumeratorメソッド、keyEnumeratorメソッドを使用する

以下のようなデータを追加したNSMutableDictionaryクラスのオブエジェクトを使用する。

    NSMutableDictionary* dict = [NSMutableDictionary dictionary];
    [dict setValue:[NSNumber numberWithInt:1] forKey:@"うさぎ"];
    [dict setValue:[NSNumber numberWithInt:2] forKey:@"きりん"];
    [dict setValue:[NSNumber numberWithInt:3] forKey:@"ねこ"];
    [dict setValue:[NSNumber numberWithInt:4] forKey:@"たぬき"];

値の一覧を取得する

    // オブジェクトの列挙を取得する
    NSEnumerator* objEnumerator = [dict objectEnumerator];
    id value = nil;
    while (value = [objEnumerator nextObject]) {
        NSLog(@"value: %@", value);
    }
    // ログ出力
    //2012-05-17 16:40:26.042 otest[7085:903] value: 4
    //2012-05-17 16:40:26.043 otest[7085:903] value: 3
    //2012-05-17 16:40:26.043 otest[7085:903] value: 2
    //2012-05-17 16:40:26.044 otest[7085:903] value: 1

キーの一覧を取得する

    // キーの列挙を取得する
    NSEnumerator* keyEnumerator = [dict keyEnumerator];
    id key = nil;
    while (key = [keyEnumerator nextObject]) {
        NSLog(@"key: %@", key);
    }
    // ログ出力
    //2012-05-17 16:40:26.044 otest[7085:903] key: たぬき
    //2012-05-17 16:40:26.045 otest[7085:903] key: ねこ
    //2012-05-17 16:40:26.046 otest[7085:903] key: きりん
	//2012-05-17 16:40:26.046 otest[7085:903] key: うさぎ

Objective-Cで使えるBOOL型(YES/NO)とBoolean型(TRUE/FALSE)の違い

ソースコード一式にBOOL型変数とTRUE/FALSEの組み合わせで使われており、ひどく違和感を覚えたのでどこで定義されているものなのか調べてみました。

BOOL

objc.hにて定義されています。

typedef signed char		BOOL; 
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
// even if -funsigned-char is used.
#define OBJC_BOOL_DEFINED


#define YES             (BOOL)1
#define NO              (BOOL)0

Boolean

CFBase.hにて定義されています。

    typedef unsigned char           Boolean;
#if !defined(TRUE)
    #define TRUE	1
#endif

#if !defined(FALSE)
    #define FALSE	0
#endif

結論

C#における、boolがSystem.Booleanのエイリアスみたいなことはなく別物でした。型と値を見ている限りは動作に問題なさそうだけど、正しい組み合わせで使いたいですね。おわり。