RoBoard魔人的機器人日誌

2012/7/19

[Robot聯大一號] 讓機器人發聲

今天要來告訴大家

要怎麼讓機器人發出聲音呢?

由於我們使用的控制板是RoBoard

而剛剛好RoBoard上可以架設Windows的環境

又很巧的Windows可以使用許許多多的函式庫

連寫程式的時間都省了   還不好嘛?

如何在RoBoard上發出聲音呢??




首先   你需要一些材料

RoBoard一台

喇叭一組

應該不難取得吧?

喇叭

喇叭(藏在身體裡面)


由於藏在身體裡面 音量會有點被壓低

不過還是很大聲

比賽時   可能是因為太吵雜   所以比較沒有人聽到





影片:
這挑釁真的是十分風騷

加上聲音之後   機器人也漸漸活起來囉!



接著

可以寫程式囉

我們需要用一個irrKlang的函式庫

可以到http://www.ambiera.com/irrklang/   下載所需的檔案

將專案屬性設定完後就可以使用這個函式庫囉!


範例程式碼:

#include <stdio.h>
#include <string.h>
#include <irrKlang.h>
using namespace irrklang;

class CMyFileFactory : public irrklang::IFileFactory
{
public:
 virtual irrklang::IFileReader* createFileReader(const ik_c8* filename)
 {
  FILE* file = fopen((char*)filename, "rb");
  if (!file) return 0;

  return new CMyReadFile(file, filename);
 }

protected:
 class CMyReadFile : public irrklang::IFileReader
 {
 public:
  CMyReadFile(FILE* openedFile, const ik_c8* filename)
  {
   File = openedFile;
   strcpy(Filename, filename);
   long cur_offset, end_offset;
   cur_offset = ftell(openedFile);
   fseek(openedFile, 0L, SEEK_END);
   end_offset = ftell(openedFile);
   fseek(openedFile, cur_offset, SEEK_SET);
   FileSize = (ik_s32)end_offset;
  }

  ~CMyReadFile()
  {
   fclose(File);
  }

  ik_s32 read(void* buffer, ik_u32 sizeToRead)
  {
   return (ik_s32)fread(buffer, 1, sizeToRead, File);
  }

  bool seek(ik_s32 finalPos, bool relativeMovement)
  {
   return fseek(File, finalPos, relativeMovement ? SEEK_CUR : SEEK_SET) == 0;
  }

  ik_s32 getSize()
  {
   return FileSize;
  }

  ik_s32 getPos()
  {
   return ftell(File);
  }

  const ik_c8* getFileName()
  {
   return Filename;
  }

  FILE* File;
  char Filename[1024];
  ik_s32 FileSize;

 }; //end class CMyReadFile
}; //end class CMyFileFactory

int main(void) {
 ISoundEngine* audioEngine = createIrrKlangDevice(ESOD_AUTO_DETECT, ESEO_MULTI_THREADED | ESEO_LOAD_PLUGINS);
 if (audioEngine){
    CMyFileFactory* demofileFactory = new CMyFileFactory();
    audioEngine->addFileFactory(demofileFactory);
    demofileFactory->drop();
    printf("sound success\n");
 } 
 char c;
 if (audioEngine)
    while((c = getchar()) != 'q'){
   switch(c){
   case 'a':
    audioEngine->play2D("sound1.wav", false, false, true);
    break;
   case 's':
    audioEngine->play2D("sound2.wav", false, false, true);
    break;
   case 'd':
    audioEngine->play2D("sound3.wav", false, false, true);
    break;
   case 'f':
    audioEngine->removeAllSoundSources();
    break;
   }

    }
 if (audioEngine) audioEngine->drop();
    return 0;
}



Q跳出
A播放聲音 sound1.wav
S播放聲音 sound2.wav
D播放聲音 sound3.wav
F停止目前的聲音



別忘記將音樂檔以及.dll檔放入資料夾內喔!
Share:

0 留言:

張貼留言

技術提供:Blogger.

追蹤者