Четверг, 28 Марта 2024, 14:29

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » SDL_mixer не воспроизводит звук (Примеры не работают)
SDL_mixer не воспроизводит звук
MorfayДата: Понедельник, 31 Октября 2011, 01:13 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Здравствуйте. Уже не первая моя тема по SDL, но что уж поделать - мануалов маловато, а разобраться очень уж хочется.

Проблема с воспроизведением звука: уже второй или третий пример отказывается работать. В чем суть: все подключается, компилируется. Музыка (пробовал как mp3 так и ogg) загружается. НО, когда выполняется программа (все просто - инициализация, загрузка и проигрывание) вижу просто консоль и, если создаю, то окно приложения. Музыки нет.

Возможная проблема: стоит VirtualBox, на котором стоит винда и все нужные проги. В MVS 2010, который установлен там же, и пишу. При установке дрова ставил на звук, но мало ли.

Вот код примера (удалю, не влияющие на понимание, проверки для минимизации):
Code


#include "stdafx.h"
#include "SDL.h"
#include "SDL_mixer.h"
#pragma comment(lib, "SDL.lib")
#pragma comment(lib, "SDL_mixer.lib")
void InitSound();

void InitSound()
{
  SDL_Init (SDL_INIT_AUDIO);
  Mix_OpenAudio (44100, MIX_DEFAULT_FORMAT, 2, 1024);
}

void PlayMusic (char *file, int chanel)
{
  Mix_Music *music;
  music = Mix_LoadMUS (file);
  Mix_PlayMusic (music, chanel);
}

int _tmain(int argc, _TCHAR* argv[])
{
  SDL_Event event;
  InitSound();
     
  int done = 0;  
  while(done == 0)
  {     
  while ( SDL_PollEvent(&event) )
  {  
      if ( event.type == SDL_QUIT )
   {  
    done = 1;  
   }  
      if ( event.type == SDL_KEYDOWN )
      {
    if ( event.key.keysym.sym == SDLK_m )
    {    
     PlayMusic("A.mp3",-1);   
    }
      }
  }
   
  }
  return 0;
}


Если кто объяснит в чем проблема, буду рад.
BOOMДата: Понедельник, 31 Октября 2011, 08:18 | Сообщение # 2
I am the creator of ADE
Сейчас нет на сайте
1. Если VirtualBox нормально воспроизводит звуки в гостевой оси, тогда проблема не в нём.
2. Я не пойму, зачем ты используешь замысловатую конструкцию done, когда можно спокойно использовать оператор break, и код будет меньше.
3. Что значит "SDL_KEYDOWN"? Как я понял, это механизм нажатия некой клавной клавиши, в котором, скорее всего, и вся проблема. Попробуй сделать то же, но через cin, библиотеки C++.

Если у тебя просто виснет программа (с приведённого кода), и реакций от нажатия клавиш нет, тогда следуй совету №3 smile


______________________________
Я вернулся, и это чудо.
______________________________
MorfayДата: Понедельник, 31 Октября 2011, 11:33 | Сообщение # 3
почетный гость
Сейчас нет на сайте
Если второй пункт понял, то третий нет. Это как так через cin? Разбираю по мануалам, никогда подобного не видел, и вообще считал, что cin из iostream нужна для ввода информации. Не могли бы привести пример, как это связать с конструкцией SDL?

P. S. да, окно подвисает и не реагирует на нажатие клавиш, потому прошу объяснить мне пункт 3 подробнее.


Сообщение отредактировал Morfay - Понедельник, 31 Октября 2011, 11:35
BOOMДата: Вторник, 01 Ноября 2011, 06:54 | Сообщение # 4
I am the creator of ADE
Сейчас нет на сайте
Morfay, 0_о ну, всё правильно, это класс ввода. В cin есть функция - перехватчик нажатия клавиши клавиатуры get. Вот код, как ею воспользоваться:

Code

int main(int argc, char* argv[])
{
      char value = 0x00;
      while(1)
      {
          cin.get(value);
          switch(value){
              case 'q' : cout << "press key 'q'" << endl; break;
              case 'w' : cout << "press key 'w'" << endl; break;
              case 'e' : return 0;   
          }
      }
      return 0;
}


А связь простая: вот этот участок кода
Code
      if ( event.type == SDL_KEYDOWN )   
        {

производит проверку, не нажата ли клавиша. Просто замени этот код на использование cin.

З.Ы. Чуть не забыл. После ввода символа на экране косоли, операция продолжается после нажатия интер, это обусловлено конструкцией всего класса ввода.


______________________________
Я вернулся, и это чудо.
______________________________


Сообщение отредактировал BOOM - Вторник, 01 Ноября 2011, 06:57
MorfayДата: Вторник, 01 Ноября 2011, 16:26 | Сообщение # 5
почетный гость
Сейчас нет на сайте
Увы, не работает - то же самое. Видимо что-то не так с самим миксером. Странно, качал с официального сайта. Поковыряю еще немного, если ничего не получится, то забью.
BOOMДата: Среда, 02 Ноября 2011, 03:58 | Сообщение # 6
I am the creator of ADE
Сейчас нет на сайте
Morfay, так, миксер для чего нужен? Прослушивать звук, или запускать их много поточно, с дополнительными эффектами?
Можно воспользоваться директом, в нём интерфейс простой.
Если лень с директом, можно использовать OpenAL - то же не плохая и функциональная библиотека для аудио.
Или же тебе нужна либа, в которой пару функций, но максимум возможностей. Тогда я тебе могу посоветовать Squall. Он вообще бесплатный и с простым API.



Но по теме.
Функция Mix_OpenAudio возвращает ошибку. Ошибка действительна, если она вернула меньше нуля. По оф докам написан хороший пример инициализации с помощью этой функции:
Code

if (Mix_OpenAudio(44100, AUDIO_S16SYS, 2, 1024) < 0)
{
      printf("Error initializing SDL_mixer: %s\n", Mix_GetError());
      exit(1);
}

Согласно коду, вначале вызывается функция Mix_OpenAudio, создавая в библиотеке общий интерфейс (внутренне). Как видно, вызов функции происходит в шапке условного оператора if, где происходит сравнение на ошибку. То есть, после выполнения, функция Mix_OpenAudio возвращает значение-статус инициализации интерфейса аудио. Если происходит ошибка, то она возвращает значение -1, тем самым выполняя условный блок оператора.
В условном блоке оператора вызывается стандартная функция Си, где выводится ошибка. Полный текст ошибки выбирается из дампа с помощью функции Mix_GetError.
Возможно, что у тебя проблема с инициализацией. Попробуй прогнать код в отладчике, но до этого просмотри документацию по возврату всех ошибок, возможно, у тебя просто не инициализируется либа.


______________________________
Я вернулся, и это чудо.
______________________________


Сообщение отредактировал BOOM - Среда, 02 Ноября 2011, 04:00
MorfayДата: Понедельник, 13 Февраля 2012, 13:51 | Сообщение # 7
почетный гость
Сейчас нет на сайте
Вряд ли. Я же и разбирал по мануалу. Со всеми проверками. Сначала была проблема, что не подгружалась музыка (выводилась ошибка), решил ее (тупо забыл нужную dll подкинуть в Debug проекта). Перекомпилил, а тут такое. Потому и спросил здесь. А когда код вылаживал, просто убрал все проверки, для минимизации.

Что касается директа и OpenAL - я просматривал их. Но сейчас я ковыряюсь в SDL и дополнительных библах к нему. SDL_image работает норм, SDL_mixer шалит. Наверно закину его на время и поковыряю SDL_net и SDL_ttf.

Возможно, есть смысл проверить билиотеку на другом компе. Надо будет потестить

Добавлено (13.02.2012, 13:51)
---------------------------------------------
Недавно вернулся к этому вопросу, после переустановки ОС. Сейчас те же примеры работают нормально. Но само воспроизведение хромает. Если музыка воспроизводится нормально, то звуки примерно в два раза быстрее чем надо. Покопался в доках, ничего про скорость воспроизведения не нашел. Кто знает, от чего зависит скорость воспроизведения в миксере?

Форум игроделов » Программирование » C/C++ » SDL_mixer не воспроизводит звук (Примеры не работают)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг