「ソフトウェアー・エンジニアリング」カテゴリーアーカイブ

ソフトウェアー関係の話題など・・

最近は、github にプッシュしてます~

クアッドコプター2

センサーを入手したところで、送信機、受信機をどうするか・・

以前は、2.4GHzの無線モジュールを使って自作しようと思いましたがー、「早く飛ばしてみたい!」とゆー事で、既存の物を買う事としましたー、例によって色々探すと、アメリカで売っている(中国製)やつが安くて高性能な感じですー、しかし、今ひとつ食指が沸かない感じです・・、そんな時、いつもお世話になっている Daytona7 でプロポを観たら、JR(日本遠隔無線)製のプロポセットがそれなりの価格で売られていたので、それを購入してみましたー
高いですがー、安物買いの何とかとゆーのもありますし、丁度良い落とし所と思います。

送信機は7チャネル、受信機は6チャネル?、基本、4チャネルあれば、ヘリコプターの機動には十分そうですがー、何か別のものを制御する事もできるしで、7チャンネルくらい必要だろうと思った次第ですー、又、この機種はテレメトリー機能があり、機体の情報をプロポに返す事が出来ます。
標準では、受信機の電圧しか返せませんが、オプションのセンサーを繋げば、色々な情報を返す事が出来るようです。

-----

さて、肝心の機体ですがー、実験機という事もあり、お手軽に作る事を考えていましたー、そこで、ホームセンターで入手できるアルミの中空材に注目しました、10mm角で、1mmアルミの押し出し材でしょうか?、アルマイト処理もしてあり、軽いです、機体は軽ければ軽いほど良いのですが、ある程度の強度も必要です、このアルミなら強度は十分で、穴を開けて軽量化も可能と思い、これで基本の骨格を制作します、中心をフライスで削り、十字に合わせます。

そして、端にモーターをマウントします。


↑モーター試運転の様子。

プロポのスロットルを中間より少し上目くらいにすると、ほんのり浮き上がります~、モーター4個なら、十分な推力が得られると思えます。

-----
じつは、フライス盤の加工範囲の関係で、最初は30cmくらいで造りました、しかし、モーターを載せてみると、プロペラが当たる事が判明・・・、34cmで作り直しました・・・ルート2倍の計算がちゃんと出来てなかった。

クアッドコプター

以前、Youtube で観てから、自分で作ってみようと考えて、色々部品を集め始めたのが1年以上前になりますー、最近ようやく、必要な部品が揃い初めて、土日に少しづつ制作しています。

最近ではフライバイワイヤーの専用コントローラーも売っているようで気軽に誰でも作れるようですが、やはり、自分で作る事の意味は大きいです。

-----

まず、最初に考える事は、全体でどのくらいの規模にするかという事、基準に考えたのはモーターでした、色々なサイトを巡り、ラジコン飛行機用のブラシレスモーターで手頃な大きさ、値段を見極めながら選んだのがこれです。

Daytona7 ラジコン専門店
※自分は、↑ここでモーター、プロペラ、アンプ、電池、充電器など揃えました~

とりあえず、このモーターで色々実験してみて、推力が足りないとか、全体のバランスとかは後で考える事にしましたー

ブラシレスモーター: EMAX CF2805
モーターアンプ: TURNIGY P10A
バッテリー: ZIPPY 2200mA (20C)

これら動力系部品を揃えたとこで、加速度センサー、ジャイロセンサー購入で、中々進まず、仕事も忙しくなり、かなりの時間スルーしていましたが・・

今年の初め、センサーを購入してから、また少しづつ進み始めました~
InvenSense 社のジャイロ、加速度センサーMPU-6150です。
※値段は1000円くらいなんですが、送料が高いので、10個購入してしまいました・・(欲しい人がいたら実費でお分けします)
QFN パッケージで、半田付けが難しいと思ったのですがー、Youtubeの半田付け動画を参考に、コテライザーに、ホットブローのコテ先を付けて、万能基板に付けてみましたー、まだ火を入れていないので、正しく動作するかは不明です・・

続く・・・

Cygwin の OpenGL 開発環境構築

Cygwin で OpenGL の開発環境を構築する場合、unix 系と Windows 系、複数のやり方があるようなのだけど、情報が少ないように感じた、それで、自分で判った事をここにメモ程度に書いておこうと思う。

まず、Cygwin では、コンパイラが複数ある、通常のソースコードと、Windows の API(WIN32-API) をコンパイルできるもの(Mingwin 系)
そして、gcc3 系と、現在最新の gcc4 系

gcc3 系では、「-m」のオプションスイッチで、Windows 環境をコンパイルする事ができるが、gcc4 系では、この機能は無くなり、クロスコンパイラで、対応をするようになった。

基本的な事だが、windows 系の開発では、unix 系で普通に使えるライブラリーの多くは利用できない、windows で利用可能なようにポートされたライブラリーを別途入れる必要があり、ヘッダーのインクルードなども適切に記述する必要がある。
※たとえば、Windows で POSIX のスレッド(pthread)を使いたいなら、POSIX Threads for Win32 をインストールする必要がある。(cygwin では、gcc の windows 系クロスコンパイラに含まれている)

OpenGL のプログラム開発では、unix 系、Windows 系、どちらでも、開発を行う事が出来るけど、unix 系では、コンソールアプリケーション以外では、X-Window のアプリとして動作させなければならず、X サーバーを通して動作させる事になる。
Windows 系では、ネイティブなバイナリーを作成でき、実行コードを配布する場合も便利なので、自分は、Windows 系の開発環境でおこなっている。
※Linux や OS-X などでも少しの改修でリコンパイルでき、動作するように、している。
基本的には glut を使うので、動かすだけなら簡単と思う。

cygwin で利用できるコンパイラ
・gcc3 gcc version 3.xx コンパイラ、これだけインストールすると、単に gcc
・gcc4 gcc version 4.xx コンパイラ、gcc version 3.xx と両方インストールすると、gcc3 と gcc4
・i686-w64-mingw32 windows のソースコードをコンパイルできるクロスコンパイラ32/64 ビット
※32ビット、64ビットのバイナリー作成では、関連ライブラリーをスイッチするようだ。

メディアプレイヤーをコンパイルする場合に必要なライブラリー郡
(1)cygwin のインストーラーでインストール出来るもの
libz 圧縮、解凍ライブラリー(自分でソースコードをコンパイルして組み込む場合は不要)
pthread-win32 POSIX のスレッドライブラリー(PTHREAD-WIN32)
glut OpenGL glut ライブラリー

(2)自分でライブラリーの構築などを行うもの(基本的に全て、オープンソース)
boost         boost ライブラリー(最新のバージョンを利用したい為、別途アーカイブを展開している。)
AL OpenAL ライブラリー
DX DirectX を gcc で使う為のヘッダー、ライブラリー(DirectSound、DirectInput を利用)
freetype2 TrueType を描画(レンダリング)する為のライブラリー
libjpeg_x86 JPEG をデコード・エンコードする為のライブラリー(x86バイナリー専用の高速版)
libpng PNG をデコード・円コードする為のライブラリー
mupdf PDF をレンダリングする為のライブラリー
openjpeg JPEG2000 ライブラリー
jbig2         JBIG2 ライブラリー
id3tag        MP3-TAG ライブラリー
↑これらは、cygwin gcc でコンパイルして、ライブラリーを構築したので、別途アーカイブしてある。

今回は、OpenGL プログラムを走らせるだけなので、↑のライブラリー構築などは割愛する。

(1) 基本的なインストール
・まず、cygwin をインストールしなければならない、インストール方法は、非常に沢山他のサイトなどで詳しく説明されているので割愛する。
・重要なのは「必要なコンポーネント」と思う。(下のリストは、足りない物があったり、余分な物があるかもしれない)
・「Devel-gcc-mingw」関係を全部インストール
・「Devel-gcc4」関係をとりあえず全部インストール(※gcc4-core と gcc4-g++ があればOK)
・「Devel-gccmakedep」をインストール(Makefile で従属規則を自動生成するのに使う)
・「Devel-mingw64-i686」関係を全てインストール
・「Devel-make」(GNU Version)をインストール

(2)インストールを確認
・今回は、コンパイラとして「i686-w64-mingw32-gcc」を使うので、コンソールから、

i686-w64-mingw32-gcc --version

以下のようなメッセージが出れば、とりあえずコンパイラのインストールは成功。

i686-w64-mingw32-gcc (GCC) 4.5.3
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

(3)gcc3 系 mingw の OpenGL 関係をコピー(この手順が適正か判らないが・・・)
・i686-w64-mingw32 環境にも OpenGL 関係のヘッダーやライブラリーはあるのだが、イマイチ使いにくいので、gcc3 系の OpenGL ライブラリーを手動でコピーして使う、ライブラリーは互換性があるようなので、4系でも使えるようだが、gdb などでデバッグするような場合は問題が起こるかもしれない。
・元のファイルをリネームして一応保存しておき、mingw 関係のヘッダーなどをコピー
cd /usr/i686-w64-mingw32/sys-root/mingw/include/GL
mv gl.h gl_h
mv glu.h glu_h
cp /usr/include/w32api/GL/*.h .
cd /usr/i686-w64-mingw32/sys-root/mingw/lib
mv libopengl32.a libopengl32_a
mv libglu32.a libglu32_a
cp /usr/lib/w32api/libopengl32.a .
cp /usr/lib/w32api/libglu32.a .
cp /usr/lib/w32api/libglut32.a .

(4)OpenGL が動作するか確認
・まず、ソースコード「main.cpp」を入力

#include <cstdio>
#include <GL/glut.h>

static GLint faces[6][4] = {  /* Vertex indices for the 6 faces of a cube. */
{0, 1, 2, 3}, {3, 2, 6, 7}, {7, 6, 5, 4},
{4, 5, 1, 0}, {5, 6, 2, 1}, {7, 4, 0, 3} };
static GLfloat v[8][3];  /* Will be filled in with X,Y,Z vertexes. */

static GLfloat g_angleX =  60.0f;
static GLfloat g_angleZ = -20.0f;

static void reshape_task(int width, int height)
{
}

static void idle_task()
{
glutPostRedisplay();
}

static void display_task()
{
int w = ::glutGet(GLUT_WINDOW_WIDTH);
int h = ::glutGet(GLUT_WINDOW_HEIGHT);
glViewport(0, 0, w, h);

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// Setup the view of the cube.
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(40.0,    // field of view in degree
1.0,        // aspect ratio
1.0,        // Z near
10.0);    // Z far
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 0.0, 5.0,    // eye is at (0,0,5)
0.0, 0.0, 0.0,    // center is at (0,0,0)
0.0, 1.0, 0.);    // up is in positive Y direction

// Adjust cube position to be asthetic angle.
glTranslatef(0.0, 0.0, -1.0);
glRotatef(g_angleX, 1.0, 0.0, 0.0);
glRotatef(g_angleZ, 0.0, 0.0, 1.0);

g_angleX += 1.0f;
g_angleZ += 0.5f;

for(int i = 0; i < 6; ++i) {
struct rgb {
GLfloat r, g, b;
};
static const rgb col[6] = {
{ 1.0f, 1.0f, 1.0f },
{ 0.2f, 1.0f, 1.0f },
{ 1.0f, 0.2f, 1.0f },
{ 1.0f, 1.0f, 0.2f },
{ 0.2f, 0.2f, 1.0f },
{ 1.0f, 0.2f, 0.2f }
};
glColor3f(col[i].r, col[i].g, col[i].b);
glBegin(GL_QUADS);
glVertex3fv(&v[faces[i][0]][0]);
glVertex3fv(&v[faces[i][1]][0]);
glVertex3fv(&v[faces[i][2]][0]);
glVertex3fv(&v[faces[i][3]][0]);
glEnd();
}

glutSwapBuffers();
}

void init()
{
// Setup cube vertex data.
v[0][0] = v[1][0] = v[2][0] = v[3][0] = -1;
v[4][0] = v[5][0] = v[6][0] = v[7][0] =  1;
v[0][1] = v[1][1] = v[4][1] = v[5][1] = -1;
v[2][1] = v[3][1] = v[6][1] = v[7][1] =  1;
v[0][2] = v[3][2] = v[4][2] = v[7][2] =  1;
v[1][2] = v[2][2] = v[5][2] = v[6][2] = -1;

// Use depth buffering for hidden surface elimination.
glEnable(GL_DEPTH_TEST);
}

int main(int argc, char** argv);

int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(512, 512);
glutCreateWindow("test cube");
glutDisplayFunc(display_task);
glutReshapeFunc(reshape_task);
glutIdleFunc(idle_task);

init();

glutMainLoop();
return 0;
}

・続いて「Makefile」を入力
#-----------------------------------------------#
# GNU-Makefile for "gcc" #
#-----------------------------------------------#
TARGET = OpenGL_Test
PSOURCES = main.cpp
CSOURCES =

OPTLIBS = opengl32 glu32 glut32

INC_SYS =
# /usr/i686-w64-mingw32/sys-root/mingw/include
# /usr/boost_1_43_0
INC_LIB =

PINC_APP =
CINC_APP =
LIBDIR =

INC_S = $(addprefix -I, $(INC_SYS))
INC_L = $(addprefix -I, $(INC_LIB))
INC_P = $(addprefix -I, $(CINC_APP))
INC_C = $(addprefix -I, $(PINC_APP))
CINCS = $(INC_S) $(INC_L) $(INC_C)
PINCS = $(INC_S) $(INC_L) $(INC_P)
LIBS = $(addprefix -L, $(LIBDIR))
LIBN = $(addprefix -l, $(STDLIBS))
LIBN += $(addprefix -l, $(OPTLIBS))

#
# Compiler, Linker Options, Resource_compiler
#
CP = i686-w64-mingw32-g++
CC = i686-w64-mingw32-gcc
LK = i686-w64-mingw32-g++
RC =

POPT = -O3
COPT = -O3
LOPT =

COF = -o
LOF = -o

PFLAGS = -DWIN32
CFLAGS = -DWIN32
LFLAGS =

# -Wuninitialized -Wunused -Werror -Wshadow
CWARN = -Wimplicit -Wreturn-type -Wswitch -Wformat

OBJECTS = $(PSOURCES:.cpp=.o) $(CSOURCES:.c=.o)

.SUFFIXES :
.SUFFIXES : .res .hpp .h .c .cpp .o

$(TARGET).exe: $(OBJECTS) Makefile
$(LK) $(LOF)$(TARGET).exe $(LFLAGS) $(LIBS) $(OBJECTS) $(LIBN)

.c.o:
$(CC) $(COPT) $(CFLAGS) $(CINCS) $(CWARN) -c $< $(COF)$@

.cpp.o:
$(CP) $(POPT) $(PFLAGS) $(PINCS) $(CWARN) -c $< $(COF)$@

.rc.c:
$(RC) $< $@

all:
make clean
make depend
make $(TARGET)

install:
cp ./$(TARGET).exe /usr/local/bin/.

run:
./$(TARGET).exe

clean:
rm -f $(OBJECTS)
rm -f $(TARGET)

dllname:
objdump -p $(TARGET).exe | grep "DLL Name"

tarball:
chmod -x *.[hc]pp Makefile
rm -f $(TARGET)_$(shell date +%Y%m%d%H)_src.tgz
tar cfvz $(TARGET)_$(shell date +%Y%m%d%H)_src.tgz \
*.[hc]pp Makefile
chmod 444 $(TARGET)_$(shell date +%Y%m%d%H)_src.tgz

zip:
$(LK) $(LOF)$(TARGET).exe $(LFLAGS) $(LIBS) -mwindows $(OBJECTS) $(LIBN)
rm -f $(TARGET)_$(shell date +%Y%m%d%H).zip
zip $(TARGET)_$(shell date +%Y%m%d%H).zip *.exe *.dll

depend:
makedepend -Y -- $(CFLAGS) $(INC_P) -- $(CSOURCES) $(PSOURCES)
# DO NOT DELETE

(5) コンパイルと実行
・まずコンパイル
make
・実行
make run
・画面に、512×512のWindowが作られ、四角い箱が回転すれば成功!

メディアプレイヤー(12月22日版)

Jコミで「らぶひな」が全巻がPDF形式で無償公開された。
PDFにはCMページとリンクが入っており、そのページ(リンク)をクリックする事で、CMのURLへジャンプするようになっている。

自分の「本プレイヤー」(ブックリーダー)は、「自炊」ファイルが対象なので、PDFを直接読む事は出来ない、それで、実験的にPDFからJPEG画像を取り出して、アーカイブしたものの、結構、面倒で時間がかかる作業だと判った、まず、画像の解像度(DPI)を指定しなければならないが、大きすぎても小さすぎても駄目な為、適当なDPI値を探る必要がある点、一番問題なのは、リンクが無くなる事で、CMへのリダイレクトが無くなり、「無償公開」の「意義」が損なわれる点。
これは、問題だ!、そこで、オープンソースのPDFリーダーを探していた、いくつかあるようだが、多少の情報収集から、SumatraPDFが良さそうと思い、早速自分のシステムに取り込んでみた。

「SumatraPDF」はC言語で書かれていて、フォントの描画はFreetype2、それに、JPEG、Jpeg2000、big2dec、PNG、Z-lib などオープンソースのライブラリーを使って構築されている。

それに先立ち、cygwin 上に新しく追加された mingw のクロスコンパイラ環境をインストールした。
以前は、gcc3 では、Windowsのコンパイル用に、「-mno-cygwin」オプションを使っていたが、新しい gcc4 系では仕様が変り「-mno-cygwin」が廃止された為コンパイル出来なかったのだが、クロスコンパイル環境を別途インストールしてWindowsのプログラムをコンパイル出来るようになった為、ようやく最新のコンパイラでWindowsのコンパイルも出来るようになった。

次に、自分のシステムに無いものとして、Jpeg2000、big2decなどがある為、まず、そこからライブラリーの作成組み込みを行った、ソースコードを取得して、mingw クロスコンパイラを使って各ソースをコンパイル、ライブラリーを作成した。

次にSumatraPDF本体を取得して、ライブラリーをコンパイル、mingw用に多少手直ししたが、これもなんとか上手く出来あがった。

次に、「apps」にあるアプリケーションのソースコードを頼りに、C++のラッパーを作成し、ブックリーダーのコア部分「pager」クラスに組み込んでみて、レンダリングさせてみたが、とりあえず動作しているようだ、一般的なPDFも食わせてみたが、フォントの描画がイマイチおかしい部分はあるものの、普通に描画できる(素晴らしい!)

後はリンクなどの処理を加えれば良い感じだけど、これは、まだ考え中で開発中。
※GUIは、基本、今までのようにしておき、そこにリンク部分を追加したい。

で、最新版をアーカイブに入れた。
コンパイル済みライブラリーやヘッダーファイルも「mingw」のアーカイブに入れておく。

メディアプレイヤー

コツコツ作ってる「メディアプレイヤー」、地味にバージョンアップしている、最近のトピックは、プリファレンス(レジストリー)に対応した点、アプリケーションが終了する際に色々な状態を記憶しておくもの、当然、マルチプラットホームなので、独自に実装してある。
テキストファイルで出して、起動時読み込むだけなんだけどね・・
でも、色々と面倒だったー(難しくは無いけど、キーワードを加工したり、細かいテキスト処理を含んでいる為、面倒だったのだけど・・・

それはそれとして、少しづつアップグレードしていますので、もし、使っている人がいれば、最新版を取得して下さい。
※使ってみて、問題があればバグレポートをtwitterのアカウントにでも送って下さい。

それはそれとして、google 先生で、「Open Media Player」を検索したら、ヒットしてました、既に「名前」が使われてます・・・
うーーーん、自分のアプリは、そんな名前にしようと思ってたのに、残念です・・・
何か、ビビットな名前を考えないと駄目ですね・・・

-----
先日、シャープより、ガラパゴスが発表されましたー
※iPadにはSDカードのインターフェースが無く、別売りのSDカードインターフェースを使って、静止画は読み込めるものの、動画や音楽を入れて食わす事が出来ない為、ガッカリ、買う気が起りません・・・
無線経由でWEBからダウンロードして読み込ませる事は出来るようですが(アプリが対応していれば)・・

そんなこんなで、多少、ガラパゴスには期待もしていたのでしたーー
ところがー、「メディアタブレット」と唄っておきながら、AV Watchの記事によると、「なお、microSDカードに収めた音楽や動画を再生する機能は備えていない。」となってます!
えーーーーーーーーーーーー、うそーーーーーーーーーーーーー、ありえないでしょーーーーーー!!!!!!
それ、「メディアタブレット」って言えないから・・

うーーん、XMDFに埋め込まれた動画などは再生出来るので、なんらかの大人の事情が炸裂したのかもしれないけどー、あまりにもひどすぎる、使う人の利便性を完全に無視して、自分たちの利益を守る事を最優先にしたこの態度は絶対に許せません。
X68000の頃からシャープは好きなメーカーだったのに、残念でたまらない。
まぁ、どうせこんな中途半端な端末は使い方が限定されて、多くの人には見向きもされないでしょうから、いいんですけどねー

やっぱ、Androide の端末にしか活路は無いのかもー

クリエイティブから良さそうなのが出ますねぇー、値段もそれなりだし、少なくとも、ガラパゴスよりは100万倍良さそうなので、買ってみたい気もするけどー

メディアプレイヤー(11月21日版)

を、また少しプログラムを更新しました。

ソースコードと実行バイナリー

一応、「メディアプレイヤー」とは何?、って人もいるので、少し説明するとーー
・OpenGL、OpenAL、POSIX 系など機種依存性が低いAPIを使い、マルチプラットホームを目指した、ソフトウェアー
・「音楽」プレイヤーでは、MP3、WAVの再生が可能(今後増やしていく予定)
※TAG に含まれた、画像をジャケットとして表示し、曲名、アーティスト名などを表示
・「本」プレイヤーでは、ZIPでアーカイブした画像ファイルの閲覧が可能
※bmp、png、jpeg
※俗に「自炊」したファイルのビューアーに適するような構成としている
・「画像」、「動画」プレイヤーは実装中で研究中・・・
・機能追加、実験、の最中なので、機能的に不十分な点や不具合は多い(現在は、プレビュー、ベータバージョンとする)
・当初は、車にPCを積んで、その再生用として、また、研究用として実装を始めた為、一般のWindowsアプリなどとは、操作、GUI に対する考えが異なり、独自の操作系と見た目をしている
・描画は、全てOpenGLで行っており、その機能依存な部分があるので、古いPCや、ネットブックなどOpenGLなどの描画性能が低いPCでは正常に動作しない場合があると思われる。
※ダブルバッファ、フルカラーで、ある程度の描画を行った場合に、60フレーム以上の描画能力が出せるビデオカードとCPU能力が必要
・試してはいないが、タッチパネルの操作を考慮した操作系としている。
※シングルタッチ仕様、(マウスでは、左クリックのみ使用)
・オープンソースにするつもり
・iPhone、iPad、Androide 版を作るつもり(こちらは有料にする予定)
・いくつかの、オープンソースライブラリーを使っている。
・基本的にC++を使って実装されている
・開発はcygwinを使い、gcc(g++)を使っている
・仮のビジュアル(ボタンやスライダーのビジュアル)

など、など、現状まだ完成度は低いけど、使ってみたい方は試してみて下さい。
※ソースコードは、OpenGLを使った、ゲームのフレームワークなどの研究用、実験用として参考になるかと思います。

操作方法:
(1) ホーム画面

・「音楽」、「本」、「画像」、「動画」ボタンのいずれかを選択

(2) 「音楽」プレイヤー

・左下のボタン ---> ファイル選択ボタン
・スライダー ---> マスターボリューム
・中央左ボタン ---> 前曲
・中央ボタン ---> プレイ、ポーズ
・中央右ボタン ---> 次曲
・右下ボタン ---> ホームに戻る

(3) 「本」プレイヤー

・左下のボタン ---> ファイル選択ボタン
・中央左ボタン ---> 次ページ(左カーソルキー)
・中央右ボタン ---> 前ページ(右カーソルキー)
・右下ボタン ---> ホームに戻る
※ボタン類(GUI)は、マウスカーソルをGUIの領域から出して、5秒程で隠れる、マウスカーソルをGUI領域に入れると再び現れる
※画面の中心から左半分をクリックすると、「次ページ」、右半分をクリックすると、「前ページ」

(4) 「画像」プレイヤー
作業中・・・

(5) 「動画」プレイヤー
作業中・・・

メディア・プレイヤー

メディア・プレイヤーとして作っているソフト、アップデートしました。

ソースコードとコンパイル済みバイナリーは、ここに置いてあります。

前回、自炊用に「本」などを閲覧できるブックリーダーをとりあえずリリースしましたが、今回は音楽プレイヤーを強化しました。

※解凍すると出来る「res」ホルダーは、実行ファイルが読み込むリソースです、実行ファイルと同じところに置いておきます。

↑起動すると立ち上がる「ホーム」です。
※GUI とかは仮の物です。

↑「音楽」を選択すると、「MusicPlayer」に移ります。

・左下のボタンを押すと、ファイラーが動くので、それで、MP3、WAVファイルのいずれかを選択すると再生が始まります。
※現状の実装では、データベース管理されておらず、フォルダー内のファイルを順次再生するだけです。

このソフト、開発の目的は、車載用なので、最低限の車載向け機能を付けて、実際に車に載せて使ってみようと思いますが、タッチパネルの付いた液晶が欲しいとこです、それと、PCの電源を自動で入れたり切ったりする機構を付けたいとこです(これは、AVRマイコンを使って電源管理しようと思います)。

・「画像プレイヤー」は手を付けていないので、機能しません・・
・「bookプレイヤー」は一応機能します。
※「スペース」キーを押すと、ファイラーが立ち上がるので、zipで固めた書庫ファイルを選択します。


※マウスの「右左」ボタンか、矢印キーでページ送りをします。

実行バイナリー、DLLが足りなくて動かないとゆー指摘を受けたのでアーカイブしなおした(汗;)
ソースコード共に微修正

Open Media Player

題名の通り、メディアの再生を目的としたプレイヤーなんだが、MP3の再生は、データベースの管理機構が無いと実用にならないので、sqlite3 のライブラリーを組み合わせて、実装を進めている、これは、まだ時間がかかりそうなので、JPEGファイルをZIPで固めた(要は漫画ファイル)ファイルのプレイヤーを先行して実装したので、とりあえず、実行ファイルとソースコードを公開しようと思う。

ソースコードは cygwin 上の gcc でコンパイルするように出来ているが、VCでもコンパイル可能だろうと思われる。

他に、boost や他のライブラリーが色々必要なので、ソースコードからのコンパイルにはある程度のスキルが必要と思う。

gcc の3系では、WIN32-API を含んだコードをコンパイル可能(VCでもコンパイル可能)で、さらに、「-mno-cygwin」オプションを使って、「cygwin1.dll」ランタイムを必要としないコンパイル環境が可能なので、それも積極的に取り入れている。

※その為、いくつかのオープンソースライブラリーとの整合性が悪くなっている。

WIN32-APIは最小限必要な部分でしか使っていない、描画は基本全部OpenGL(glut32ライブラリー)だし、オーディオ関係はOpenALで実装しているので、他のプラットフォームへ持って行きやすいと思う(実際、一部はiPhone、iPadで動作する)、ゆくゆくは、OS-X、Linux、などマルチプラットホームで展開していきたいと思っている。

とりあえず、

http://www.rvf-rc45.net/SOFT-archive

に各種ソースコードと実行ファイルなどを置いておく。

MP3 TAG に関する事・・・

昔から、趣味で MP3 のプレイヤーを作っている。

まぁ、自分で実装しないでも、沢山のクールなプレイヤーがあるけど、自分としては、全画面で、OpenGL を使って、車載 PC 用のソフトとしたいので、コツコツ実装している。
※ある程度「型」になったら、発表する事が出来ると思う。

何故自分で作ろうかと思った、その背景には、組み込み機器向けにも転用するとか、専用ハードでアプリをコントロールしたいとか、理由は色々。
一番の動機は「面白そう」だからー(笑)

-----
最近は、データベース関連の実装を進めているけど、その前に、MP3 TAG 情報関係をスマートに扱う必要があるのだが、これが結構厄介な問題を含んでいると判った。

MP3 タグを扱うには、オープンソースでは、「libid3」がメジャーと思うが、規模が大きく、機能も豊富で、他のライブラリーに依存しているのが、扱いにくい。
※純粋に MP3 タグの部分だけパース出来れば・・・

ネットを見渡すと他には「libid3tag」なるソースコードもある。
http://sourceforge.net/projects/mad/files/

「libid3tag」は、ソースコードは取得出来るものの、既に開発は止まっているようで、最低限の機能しか無いが、C で書かれていて、逆に最低限の機能しか無い事が、コンパクトな機器などにも向いているように思う。
自分は、「libid3tag」導入が簡単と思った為、こちらを組み込んだが・・・

色々問題を抱えてしまった・・・
まず、良くある話だが、「MP3 TAG を埋め込む側のソフトウェアー」問題が複数ある。
これは、MP3 のタグ情報を埋め込む際、そのソフトウェアーのバグによって、規定とは違った方法で情報が埋め込まれてしまっている事が沢山ある。
規定外のタグ情報は、無視すれば良いと思うかもしれないが、そんな曲データが沢山あると、無視も出来ない事になる。
※iTunes のように、非常に多くのユーザーがいるアプリケーションでも例外では無い。

-----
最近この対応を行った点としてー、MP3 の TAG に「APIC」と言う画像を添付する規定があるが、特定の iTunes で作成した MP3 をパースした際、画像を取得できない場合がある事が判明したー。
良く調べてみると、画像に関するテキスト情報フィールドで、それが無い場合には、当然「0x0」を埋め込む必要があるのだが、それが抜けている為、次のフィールドデータを浸食してしまい、結果、画像情報ヘッダーの一部が無くなってしまい、画像を特定できなくなってしまう。

別のプレイヤーで試したが(もちろんiTunesでも)、この規定外の MP3 ファイルでも、ちゃんと添付画像を表示できる。

そこで、この腐った MP3 を何とかする方法を考えて、対応したが、これからもこんな事が色々あるのだろうなと思う・・・(泣)

まぁ、最低限パースの際にクラッシュしなければ合格なんですけどね・・・

ブログシステム

今まで、プロバイダ標準のブログシステムを使ってたけど、PHPやSQLも使えるのだから、何かオープンソースのプログシステムを導入しようと考えていた。

何が良いのか色々探したが、沢山ありすぎて悩む事ー悩む事ー、そんな時、twitterで誰かがつぶやいていた「ブログ」、ホームページに行ってみたら、自分も導入してみたくなった。

そんで、入れてみたー

これから、少しづつ移行してみようと思いまーす。