MCIで音楽再生
どうも
かなり久々に日記書きました。
内定を頂いてから駄目人間になりかけたので、本来の自分を取り戻そうと思います。
MCIでコンソールによる音楽再生プログラム
mciSoundPlay.h
#include<windows.h>
#include<string.h>
#include<digitalv.h> //速度変更に使用するヘッダ
class MciSoundPlay
{
public :
MCI_OPEN_PARMS mop;
MCI_PLAY_PARMS mpp;
MCI_GENERIC_PARMS mgp;
MCI_DGV_SET_PARMS mdsp;
MciSoundPlay(LPCSTR titlePath);
void soundPlayBack();
void soundStop();
void soundRewind();
void soundInterrupt();
void soundPlayInterrupt();
void SoundSpeedChange();
void SoundEnd();
};mciSoundPlay.cpp
#include"MciSoundPlay.h"
#include<windows.h>
#include<iostream>
#include<digitalv.h> //速度変更に使用するヘッダ
// winmm.lib をリンクする
#pragma comment(lib,"winmm.lib")
MciSoundPlay::MciSoundPlay(LPCSTR titlePath)
{
int err;
TCHAR strErr[512];
//mop.lpstrDeviceType = "WaveAudio";
mop.lpstrDeviceType = "MPEGVideo";
//mop.lpstrElementName= "曲ファイルのパス";
mop.lpstrElementName= titlePath;
err = mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,(DWORD)&mop); //成功するとwDeviceIDに値が代入される
if(err)
{
mciGetErrorString(err,strErr,512);
std::cout << "ErrCode -> " << strErr << std::endl;
exit(0);
}
//構造体の中身確認
std::cout << "mop.lpstrDeviceType = " << mop.lpstrDeviceType << std::endl;
std::cout << "mop.lpstrElementName = " << mop.lpstrElementName << std::endl;
std::cout << "mop.wDeviceID = " << mop.wDeviceID << std::endl;
}
void MciSoundPlay::soundPlayBack()
{
//mciSendCommand(mop.wDeviceID,MCI_PLAY,0,0); //Wave用
mciSendCommand(mop.wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0); //先頭位置に設定
mciSendCommand(mop.wDeviceID, MCI_PLAY, 0, (DWORD)&mpp); //再生
std::cout << "--- 再生 ---" << std::endl;
}
void MciSoundPlay::soundStop()
{
mciSendCommand(mop.wDeviceID, MCI_STOP, 0, 0); //停止
mciSendCommand(mop.wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0); //先頭位置に設定
std::cout << "--- 停止 ---" << std::endl;
}
void MciSoundPlay::soundRewind()
{
mciSendCommand(mop.wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0); //先頭位置に設定
mciSendCommand(mop.wDeviceID, MCI_PLAY, 0, (DWORD)&mpp); //再生
std::cout << "--- 巻き戻し ---" << std::endl;
}
void MciSoundPlay::soundInterrupt()
{
mciSendCommand(mop.wDeviceID, MCI_PAUSE, 0, 0); //一時停止
std::cout << "--- 一時停止 ---" << std::endl;
}
void MciSoundPlay::soundPlayInterrupt()
{
mciSendCommand(mop.wDeviceID, MCI_RESUME, 0, 0); //一時停止解除
std::cout << "--- 再生 ---" << std::endl;
}
void MciSoundPlay::SoundSpeedChange()
{
double spd_val;
std::cout << "再生速度を変更します。" << std::endl;
std::cout << "0.5 〜 2.0 の範囲で指定してください" << std::endl;
std::cout << "※標準速度は1.0です" << std::endl;
std::cout << "再生速度 = ";
std::cin >> spd_val;
mdsp.dwSpeed = (int)(spd_val * 1000); //速度設定
std::cout << "--- 速度 = " << mdsp.dwSpeed << "---" << std::endl;
mciSendCommand(mop.wDeviceID, MCI_SET, MCI_DGV_SET_SPEED, (DWORD)&mdsp); //速度変更
std::cout << "--- 速度変更 ---" << std::endl;
}
void MciSoundPlay::SoundEnd()
{
std::cout << "アプリケーションを終了します" << std::endl;
mciSendCommand(mop.wDeviceID ,MCI_CLOSE ,0 ,(DWORD_PTR)&mgp);
}mciCommandPlay.cpp
#include"MciSoundPlay.h"
#include<iostream>
int main()
{
int data;
LPCSTR titlePath = "曲ファイルのパス";
MciSoundPlay msp(titlePath);
while(1)
{
std::cout << "数字を入力してください" << std::endl;
std::cout << "************************" << std::endl;
std::cout << "1:再生" << std::endl;
std::cout << "2:停止" << std::endl;
std::cout << "3:巻き戻し" << std::endl;
std::cout << "4:一時停止" << std::endl;
std::cout << "5:一時停止解除" << std::endl;
std::cout << "6:速度変更" << std::endl;
std::cout << "9:終了" << std::endl;
std::cout << "************************" << std::endl;
std::cout << "数字 = ";
std::cin >> data;
if(data == 9)
{
msp.SoundEnd();
break;
}
switch(data)
{
case 1: //再生
msp.soundPlayBack();
break;
case 2: //停止
msp.soundStop();
break;
case 3: //巻き戻し
msp.soundRewind();
break;
case 4: //一時停止
msp.soundInterrupt();
break;
case 5: //一時停止解除
msp.soundPlayInterrupt();
break;
case 6: //速度変更
msp.SoundSpeedChange();
break;
}//swicth
}//while
}現在学校でwiiリモコンを使った音楽アプリケーションを作成しており、自分は音楽再生担当なのでこのプログラムを作成した。
mp3を再生するのに何を使えばいいかわからなかった。調べていくと「MCI」で音楽を再生できることがわかった。
MCIコマンドによる再生とよく使う操作
http://www13.plala.or.jp/kymats/study/MULTIMEDIA/mciCommand_play.html
MCIに関してのWebページが少なく、困ることが多かった。
音楽再生をするときはMCIを使用しないのかな?
このブログを見て「私はこれで音楽再生したよ!」という人がいたらぜひ教えて頂きたい。
キャリアパス
みなさんは自分のキャリアパスについて考えたことがありますか?
私自身、キャリアパスを考えようと思ったことは何度もありますが、
あえて考えることを避けてきました。
理由としては、キャリアパスを考えたからといってその通りに進むわけがなく、
自分にもわかりませんが、キャリアパスに対する恐怖心があったのです。
おそらく、その恐怖心は「将来への不安」なのではないかと思われます。
自分の考えたキャリアパス通りに進めるのか?自分の考えたキャリアパスは
本当に正しいのか?など、色々な恐怖が存在するわけです。
私はキャリアパスについて考えていることをTwitterでつぶやいたら結構反響が良く、
キャリアパスについて考えている人はそこまでいないことがわかりました(多分学生時代)。
しかし、多々いるTwitterの技術者達にはある1つ共通点がありました。それは・・・
TwitterClient2
久々のブログ更新です。
色々あって更新できませんでした。
さぁプログラムだ。
regeek TwitterClientのパワーアップ
今回追加した機能は、JTableによるアイコン表示です。Twitterクライアントにはかかせない画像表示の機能をなんとかつけたかったので頑張りました。
TimeLine.java
import twitter4j.*; import javax.swing.*; import javax.swing.table.DefaultTableColumnModel; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; import javax.swing.table.TableModel; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.SimpleDateFormat; import java.util.Date; public class TimeLine implements ActionListener { Twitter twitter; JPanel timeLinePanel; JPanel updatePanel; JTextField updateField; JButton updateButton; JLabel iconLabel; ImageIcon icon; JTable table; public TimeLine(Twitter twitter) throws TwitterException{ this.twitter = twitter; timeLinePanel = new JPanel(); updateField = new JTextField(); updatePanel = new JPanel(new FlowLayout()); updatePanel.setSize(600, 30); updatePanel.setPreferredSize(new Dimension(600, 30)); updatePanel.setMaximumSize(new Dimension(600, 30)); updateButton = new JButton("Update"); updateButton.setSize(90, 20); updateButton.setPreferredSize(new Dimension(90, 20)); updateButton.setMaximumSize(new Dimension(90, 20)); updateButton.addActionListener(this); updateField = new JTextField(); updateField.setSize(400, 20); updateField.setPreferredSize(new Dimension(400, 20)); updateField.setMaximumSize(new Dimension(400, 20)); updatePanel.add(updateField); updatePanel.add(updateButton); timeLinePanel.add(updatePanel); updateTimePanel(); } private void updateTimePanel() throws TwitterException { java.util.List<Status> statusList = twitter.getFriendsTimeline(); Object statusArr[][] = new Object [statusList.size()][2]; timeLinePanel.setLayout(new BoxLayout(timeLinePanel, BoxLayout.Y_AXIS)); for (int i = 0; i < statusList.size(); i++) { statusArr[i][0] = new ImageIcon(statusList.get(i).getUser().getProfileImageURL()); Date tweetDate = statusList.get(i).getCreatedAt(); SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yy HH:mm"); statusArr[i][1] = statusList.get(i).getUser().getName() + statusList.get(i).getText() + "-" + formatter.format(tweetDate); } Object columnName[] = {"icon","text"}; DefaultTableModel statusTable = new MyTableModel(statusArr,columnName); JTable table = new JTable(statusTable); //列幅の指定 DefaultTableColumnModel columnMode = (DefaultTableColumnModel)table.getColumnModel(); TableColumn column1 = null; TableColumn column2 = null; column1 = columnMode.getColumn(0); column1.setPreferredWidth(150); column2 = columnMode.getColumn(1); column2.setPreferredWidth(850); table.setAutoResizeMode(table.AUTO_RESIZE_OFF); //高さの指定 table.setRowHeight(50); JScrollPane scrollPane = new JScrollPane(table); scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); timeLinePanel.add(scrollPane); } class MyTableModel extends DefaultTableModel{ MyTableModel(Object[][] data,Object[] columName){ super(data,columName); } public Class getColumnClass(int col){ return getValueAt(0, col).getClass(); } } public JPanel getTimeLinePanel() { return timeLinePanel; } @Override public void actionPerformed(ActionEvent e) { try { twitter.updateStatus(updateField.getText()); updateTimePanel(); timeLinePanel.remove(1); timeLinePanel.updateUI(); updateField.setText(""); } catch (TwitterException exception) { JOptionPane.showMessageDialog(null, "An error has occurred while updating."); exception.printStackTrace(); } } }
今回よくわからなかったのは以下のコード
class MyTableModel extends DefaultTableModel{ MyTableModel(Object[][] data,Object[] columName){ super(data,columName); } public Class getColumnClass(int col){ return getValueAt(0, col).getClass(); } }
このコードがないと画像を表示することができないらしい。
MyTableModelクラスについてはまだ理解出来るが、
getColumnClassクラスがわからない。
MyTableModelクラスの中でgetColumnClassクラスを宣言しているから内部クラスなのだろうか?
getColumnClassクラスの引数、int col にどこで値を渡しているかなどがよく分からない。
まだまだ勉強不足です。
画像
次の課題
Jtableのテキストを折り返すようにする。折り返さないとみんなのつぶやきが見れないよ><
javaマスターの方がこのブログを見ていたら助けてください!
よろしくお願いします。
