Russian developers comminity

Новости ::  Документация ::  Uploads ::  Downloads ::  Ссылки 
 

Программирование


 
Вопросы связанные с программированием игр для ОС Linux.

Темы :

: :

Проблема с воспроизведением звука

Пользователь: Jony

Дата: 28.11.2009 16:06:59

Помогите мне пожалуйста ,скачал готовый пример воспроизведения аудио,подключил к проэкту либ
SDL mixer,но выбивает ошибку в lib SDLmain.a
in function console_main
246 underfined refrence to SDL_main
Что это значит ,что в этом случае нужно делать?Помогите мне или напишите свой работующий простой пример с аудио воспроизведением .Очень надо хочу к своей игрушки подключить мелодию,звуки.Еще раз прошу, помогите .

#include <SDL/SDL.h>
#include <SDL/SDL_audio.h>
#include <SDL/SDL_mixer.h>
#include <stdlib.h>
#include <string.h>
#include <iostream.h>



void
InitSound ()
{
// start SDL with audio support
if (SDL_Init (SDL_INIT_AUDIO) == -1)
{
printf ("SDL_Init: %s\n", SDL_GetError ());
exit (1);
}
// open 44.1KHz, signed 16bit, system byte order,
// stereo audio, using 1024 byte chunks
if (Mix_OpenAudio (44100, MIX_DEFAULT_FORMAT, 2, 1024) == -1)
{
printf ("Mix_OpenAudio: %s\n", Mix_GetError ());
exit (2);
}
cout << "InitSound-OK" << endl;
}

void
PlaySound ( Mix_Chunk *sample)
{
if (!sample)
{
printf ("Mix_LoadWAV: %s\n", Mix_GetError ());
// handle error
}

// play sample on first free unreserved channel
// play it exactly once through
if (Mix_PlayChannel (-1, sample, 0) == 0)
{
printf ("Mix_PlayChannel: %s\n", Mix_GetError ());
// may be critical error, or maybe just no channels were free.
// you could allocated another channel in that case...
}
}

void
PlayMusic (char *file, int chanel)
{
// load the music file to play as music
Mix_Music *music;
music = Mix_LoadMUS (file);
if (!music)
{
printf ("Mix_LoadMUS(\"*.*\"): %s\n", Mix_GetError ());
// this might be a critical error...
}

if (Mix_PlayMusic (music, chanel) == chanel)
{
printf ("Mix_PlayMusic: %s\n", Mix_GetError ());
// well, there's no music, but most games don't break without music...
}
};

int main()
{
cout<<"SDL Sound Example"<<endl;
InitSound();
Mix_Chunk *sample1;
sample1 = Mix_LoadWAV ("./7.wav");
PlayMusic("./inheaven.s3m",-1);
PlaySound(sample1);
while(true){}
};
Опции:

Re: Проблема с воспроизведением звука

Пользователь: keltar

Дата: 01.12.2009 15:21:23

http://www.libsdl.org/faq.php?action=listentries&category=4#48

В двух словах - int main(int argc, char **argv)и никак иначе.
Остальное (iostream вместо iostream.h, using namespace std и гремучая смесь из printf и cout) уже из другой оперы и требует указания системы и компилятора, если вызывает проблемы.
Опции:

Re: Проблема с воспроизведением звука

Пользователь: bEe_

Дата: 02.12.2009 11:08:39

keltar Написал:
-------------------------------------------------------
> http://www.libsdl.org/faq.php?action=listentries&a
> mp;category=4#48
>
> В двух словах - int main(int argc, char
> **argv)и никак иначе.
> Остальное (iostream вместо iostream.h, using
> namespace std и гремучая смесь из printf и cout)
> уже из другой оперы и требует указания системы и
> компилятора, если вызывает проблемы.
>

По теме: -lSDLmain к проекту под виндой.


keltar как дела smiling smiley)))




Редактировано 1 раз. Последний раз 02.12.2009 11:10.
Опции:

Re: Проблема с воспроизведением звука

Пользователь: keltar

Дата: 02.12.2009 16:02:42

Насколько я понял из не дословного описания ошибки - оно не попадает в extern "C" из-за перегрузки и заваливается уже на линке с -lSDLmain. Возможно ошибаюсь; возможно компилятор сам должен запрещать перегрузку, если ранее был декларейшн с экстерном - многое забыл.

Дела, кхм... Ну в общем чёрт с ними. Завтра, думаю, в irc появлюсь.
Опции:

Re: Проблема с воспроизведением звука

Пользователь: Aerton

Дата: 02.12.2009 20:38:08

> По теме: -lSDLmain к проекту под виндой.
>

Или вместо этого

#ifdef WIN32
#define main SDL_main
#endif

Опции:

Re: Проблема с воспроизведением звука

Пользователь: Jony

Дата: 03.12.2009 17:12:56

Спосибо большое ,kelter,
записал вместо int main()
int main(int argc, char **argv)и все получилось ,
музыка играет .Огромное спася,теперь я слышу музыку-у-у.Супер!Теперь остается подключить к игре.
А можно сделать ,чтобы музыка играла например несразу,а спустя 10 секунд,это вроде возможно с помощью таймера?Если можешь, скажи как это сделать.
Опции:

Re: Проблема с воспроизведением звука

Пользователь: keltar

Дата: 04.12.2009 12:37:52


Uint32 sound_play_timer(Uint32 interval, void *param) {
  // тут код проигрывания музыки
  return 0;
}

и перед основным циклом
SDL_AddTimer(10000, sound_play_timer, 0);

Не красиво, но работать должно. Красиво - через получение текущего времени, тебе пока это не надо.
Опции:

Re: Проблема с воспроизведением звука

Пользователь: Jony

Дата: 13.12.2009 17:50:32

kelter,почему-то не выходит ,я поискал и нашел еще вариант с таймером ,все ыполняется без ошибок
,но музыка не играет.Взгляни .Подскажи пожалуйста что делать.
И еще вопрос,как сделать чтобы нормально выходить
из окна консоли ,потому что пишет ошибка при чтении инструкция обратилась по адресу ,прочесть нельзя при закрытии окна консоли.Подскажи еще пожалуйста ф-цию
остановки и выхода музыки.

#include <SDL/SDL.h>
#include <SDL/SDL_audio.h>
#include <SDL/SDL_mixer.h>
#include <stdlib.h>
#include <string.h>
#include <iostream.h>


Uint32 my_callbackfunc(Uint32 interval, void*param);



void* my_callback_param;
void
InitSound ()
{
// start SDL with audio support
if (SDL_Init (SDL_INIT_AUDIO | SDL_INIT_TIMER) == -1)
{
printf ("SDL_Init: %s\n", SDL_GetError ());
exit (1);
}
atexit(SDL_Quit);
// open 44.1KHz, signed 16bit, system byte order,
// stereo audio, using 1024 byte chunks
if (Mix_OpenAudio (44100, MIX_DEFAULT_FORMAT, 2, 1024) == -1)
{
printf ("Mix_OpenAudio: %s\n", Mix_GetError ());
exit (2);
}
cout << "InitSound-OK" << endl;
}

void
PlaySound ( Mix_Chunk *sample)
{
if (!sample)
{
printf ("Mix_LoadWAV: %s\n", Mix_GetError ());
// handle error
}

// play sample on first free unreserved channel
// play it exactly once through
if (Mix_PlayChannel (-1, sample, 0) == 0)
{
printf ("Mix_PlayChannel: %s\n", Mix_GetError ());
// may be critical error, or maybe just no channels were free.
// you could allocated another channel in that case...
}
}

void
PlayMusic (char *file, int chanel)
{
// load the music file to play as music
Mix_Music *music;
music = Mix_LoadMUS (file);
if (!music)
{
printf ("Mix_LoadMUS(\"*.*\"): %s\n", Mix_GetError ());
// this might be a critical error...
}

if (Mix_PlayMusic (music, chanel) == chanel)
{
printf ("Mix_PlayMusic: %s\n", Mix_GetError ());
// well, there's no music, but most games don't break without music...
}
};

int main(int argc, char **argv)
{
cout<<"SDL Sound Example"<<endl;
InitSound();


SDL_TimerID my_timer_id = SDL_AddTimer(1000, my_callbackfunc, my_callback_param);SDL_AddTimer(1000, my_callbackfunc, my_callback_param);//PlayMusic("./inheaven.s3m",-1);while(true){}

SDL_RemoveTimer(my_timer_id);
};
Uint32 my_callbackfunc(Uint32 interval, void *param) {


Mix_Chunk *sample1;
sample1 = Mix_LoadWAV ("./7.wav");PlaySound(sample1);while(true){}
return interval;
// тут код проигрывания музыки

}
Опции:

Re: Проблема с воспроизведением звука

Пользователь: Aerton

Дата: 14.12.2009 05:11:08

Во-первых, используй тег[code], - читать код, сбитый в кашу, удовольствия мало.

Во-вторых, ты зачем-то делаешь два таймера, потом один из них удаляешь.

По таймеру, воспроизводится 7.wav а PlayMusic() ниоткуда не вызывается.

Ни и последнее, ты тут же выходишь из main(), не дожидаясь таймера и не закрывая SDL.
Опции:

: :

Извините, только зарегистрированные пользователи могут писать в этом форуме.