読者です 読者をやめる 読者になる 読者になる

S.F. Page

Programming,Music,etc...

音声ファイルから動画ファイルを作成する(4) - StorageFile::OpenAsyncでハマっている

FileOpenPickerを使ってWAVファイルを選択してOpenAsyncでファイルを開こうとしている。簡単なコードなのだがよくわからない例外が発生して悩んでいる。

void sfmfMain::OpenFile()
{

	auto openPicker = ref new Windows::Storage::Pickers::FileOpenPicker();
	openPicker->FileTypeFilter->Append(L".wav");
	openPicker->FileTypeFilter->Append(L".mp4");
	create_task(openPicker->PickSingleFileAsync()).then([this](Windows::Storage::StorageFile^ file)
	{
		if (file != nullptr){
			create_task(file->OpenAsync(Windows::Storage::FileAccessMode::Read)).then([this, file](Windows::Storage::Streams::IRandomAccessStream^ stream)
			{
				m_audioReader = ref new sf::AudioReader(stream);
			});
				//Windows::Storage::StorageFile^ st = create_task(Windows::Storage::KnownFolders::VideosLibrary->CreateFileAsync(L"test.m4v", Windows::Storage::CreationCollisionOption::ReplaceExisting)).get();
				//auto stream = create_task(st->OpenAsync(Windows::Storage::FileAccessMode::ReadWrite)).get();
				//m_videoWriter = ref new sf::VideoWriter(stream);
		}
	}
	);

}

上記コードのOpenAsyncのところで下記エラーが発生する。

0x8004001というエラーはE_NOTIMPLということでOpenAsyncは実装されていないということらしい。そんなはずはないのだが。今のところどうしたもんかと悶々としている状態である。しかしこんな簡単そうなところでハマるとは。。非同期プログラミングがいまいちよくわかっていないのでそのせいもあるかも。

ファイルを開くメソッドも非同期とはマイクロソフトの徹底ぶりはちょっと偏執的じゃないのかなと最初思ったけどインターネット上にあるファイルを想定するとファイルを開くのも時間がかかるのでインターネットが普通の時代ではこの設計は正しいのだなと勝手に納得している次第。