상세 컨텐츠

본문 제목

ogg 파일을 스트림 버퍼로 읽어 들이기

프로그래밍 관련/사운드

by AlrepondTech 2011. 1. 6. 18:12

본문

반응형

 

 

 

 

=================================

=================================

=================================

 

 

 

 

 

 

파일이 아니고 zlib 나 버퍼로 받은 ogg파일을 읽을 필요가 있어서 찾아보았다
그냥 파일 읽기로 할까라고 생각했지만 구글링, gpg 연동해서 찾아보아서 해결


gpg 참조 내용






올리기vorbisfile라이브러리에서 ov_open 사용시 올려짐: 2006-03-10 17:40
인용과 함께 답변 이 게시물을 del.icio.us에 추가

안녕하세요.

ogg파일을 통째로 메모리에 올린 다음에

char* buf; <- 파일을 통째로 메모리에 올림
int size; <- 그 사이즈
OggVorbis_File ogg_file; <- ogg 정보파일?

ov_open( 0, &ogg_file, (char*)buf, size );

이런식으로 버퍼를 통째로 넣어서 해봤는데요.

재생은 되는 것 같은데, 정보파일이 이상합니다.

그냥

FILE* fp = fopen( "test.ogg", "rb" );
ov_open( fp, &ogg_file, 0, 0 );

이렇게 해준거랑 ogg_file을 서로 비교해보면 값이 틀리네요.

기존 코드를 수정하고 있는 중인데

도움 부탁드립니다.ㅠ.ㅠ
위로
 
비회원
손님




올리기자답입니다. 올려짐: 2006-03-10 18:17
인용과 함께 답변 이 게시물을 del.icio.us에 추가

http://www.devmaste...howthread.php?t=1153

저 처럼 삽질 하지 마시라고 올립니다.ㅠ.ㅠ
 
 
참조 사이트
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

ALuint OpenALWrap::LoadALBufferOgg(std::string cp_wave_fname)
{
//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)

playogg.zip
다운로드

 

 

 

반응형

 

728x90

 

 

 

=================================

=================================

=================================

 

 




// 구현 함수 (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);


...

}


=================================

=================================

=================================

 

 

 

 

반응형


관련글 더보기

댓글 영역