=================================
=================================
=================================
파일이 아니고 zlib 나 버퍼로 받은 ogg파일을 읽을 필요가 있어서 찾아보았다
그냥 파일 읽기로 할까라고 생각했지만 구글링, gpg 연동해서 찾아보아서 해결
gpg 참조 내용
|
|||||||
비회원 손님 |
|
||||||
|
참조 사이트
http://www.devmaster.net/articles/openal-ogg-file/
http://www.devmaster.net/forums/showthread.php?t=1153
http://www.gamecode.org/tt/entry/oggplay
참조 소스 1
{
//define some variables
FILE* tempOggFile; // file handle
ALuint buffer; // Buffer id for the loaded buffer.
ALuint result2;
vorbis_info* MyInfo; // some formatting data
vorbis_comment* MyComment; // user comments
OggVorbis_File oggData; //for fully loaded sound effects
//generate a buffer for OpenAL
alGenBuffers(1, &buffer);
if ((result2 = alGetError()) != AL_NO_ERROR)
cout << "\nCouldn't generate a buffer: " << GetALErrorString(result2);
//load an ogg file
if(NULL == (tempOggFile = fopen(cp_wave_fname.c_str(), "rb")))
printf("\ncould not open ogg file");
//find out how big it is
sizeOfFile = 0;
fseek(tempOggFile, 0, SEEK_END);
sizeOfFile = ftell(tempOggFile);
fseek(tempOggFile, 0, SEEK_SET);
// Save the data into memory
oggMemoryFile.dataPtr = new char[sizeOfFile];
rewind(tempOggFile);
tempArray = 0;
while (!feof(tempOggFile))
{
oggMemoryFile.dataPtr[tempArray] = getc(tempOggFile);
tempArray++;
}
//save the ogg file into memory
oggMemoryFile.dataRead = 0;
oggMemoryFile.dataSize = sizeOfFile;
vorbisCallbacks.read_func = VorbisRead;
vorbisCallbacks.close_func = VorbisClose;
vorbisCallbacks.seek_func = VorbisSeek;
vorbisCallbacks.tell_func = VorbisTell;
if (ov_open_callbacks(&oggMemoryFile, &oggData, NULL, 0, vorbisCallbacks) != 0)
cout << "Could not read Ogg file from memory";
//define some variables for moving and converting the ogg file for use by OpenAL
char* pcm = new char[sizeOfFile];
int size = 0;
int section;
int result;
참조 코드 2 (www.gamecode.org)
=================================
=================================
=================================
// 구현 함수 (game code 에서 거의 참조)
LoadOggMemory(BYTE* pData, int size) // pData - ogg 파일 메모리 버퍼, size 버퍼 크기
{
SOggFile oggMemoryFile;
OggVorbis_File vf;
//해당 메모리를 SOggFile 해당 변수에 설정
oggMemoryFile.dataPtr = (char*)pData;
oggMemoryFile.dataRead = 0;
oggMemoryFile.dataSize = size;
#ifdef _USER_FILEIO
if ( ov_open_callbacks(&oggMemoryFile, &vf, NULL, 0, _ogg_memory_callbacks) < 0)
#else
if (ov_open(fp, &vf, NULL, 0) < 0)
#endif
{
return false;
}
//OGG 사운드 채널,설정에 따라 계산한것을 지정
vorbis_info *vi = ov_info(&vf, 0);
int pcm_total = (int)ov_pcm_total(&vf, 0) - 44;
int len = pcm_total * vi->channels * 16 / 8;
IDirectSoundBuffer* pSndBuffer;
LPDIRECTSOUNDBUFFER pSndBufferTmp;
// 다이렉트 사운드 버퍼를 만들고 lock을해서 옮겨준면 성공!!
pSndBuffer = CreateSoundBuffer(vi->rate, 16, vi->channels, pcm_total);
if(! pSndBuffer)
{
return false;
}
unsigned long size1, size2;
void *data1, *data2;
pSndBuffer->Lock(0, len, &data1, &size1, &data2, &size2, 0);
for(int i=0; i<len; )
{
int bs = 0;
int readbytes = ov_read(&vf, (char*)data1+i, len-i, _ENDIAN, 16/8, _SIGN, &bs);
if (bs != 0) // Only one logical bitstream currently supported
break;
if (readbytes < 0)
continue;
if (readbytes == 0)
break;
i += readbytes;
}
pSndBuffer->Unlock(0, 0, 0, 0);
ov_clear(&vf);
...
}
=================================
=================================
=================================
'프로그래밍 관련 > 사운드' 카테고리의 다른 글
Direct Sound Creating Secondary Buffers (0) | 2020.09.13 |
---|---|
동일 사운드 반복 플레이 DuplicateSoundBuffer (칼, 총기류 난사시 사운드) (0) | 2011.01.06 |
엘리시아 이브의 심심강좌 사운드 (0) | 2011.01.06 |
다이렉트 사운드 더블 버퍼링 또는 다중버퍼관리출력 (0) | 2011.01.05 |
박한규님 사운드 프로그래밍 강좌 (0) | 2011.01.05 |