Это в порядке для смешивания AudioServicesPlaySystemSound и AVAudioPlayer?

Если вам не удалось вызвать super в конструкторе, то компилятор добавит супер-вызов без аргументов в качестве родительского конструктора для первой строки тела конструктора.

Как и в ранее опубликованном коде

public class Foo
{
}

или

public class Foo
{
  public Foo()
  {
  }
}

, компилятор сгенерирует код, который соответствует правилам Java. Все объекты являются подклассами java.lang.Object, поэтому компилятор скомпилирует его так, как если бы он был написан

// All classes extend Object.  This is Java, after all.
public class Foo extends java.lang.Object
{
  public Foo()
  {
    // When constructing Foo, we must call the Object() constructor or risk
    // some parts of Foo being undefined, like getClass() or toString().
    super()
  }
}

Но если суперкласс не имеет конструктора, который соответствует параметрам, то вы должны вызовите соответствующий несоответствующий конструктор суперкласса.

public class LightBlue extends java.awt.Color
{
  public LightBlue()
  {
    // There is no Color() constructor, we must specify the suitable super class
    // constructor.  We chose Color(int red, int green, int blue).
    super(172, 216, 230);
  }
}

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

public class HSVColor extends Color
{
  public HSVColor(int hue, int saturation, int value)
  {
    super(...code converting HSV to Red...,
          ...code converting HSV to Green...,
          ...code converting HSV to Blue);
  }
}

Если вы не указали явно конструктор суперкласса, то компилятор добавит конструктор суперкласса по умолчанию без аргументов. Однако, если этот конструктор не существует, компилятор не будет компилировать класс, потому что неясно, какой из представленных конструкторов является правильным для вызова.

Это вопрос стиля, но вы можете решить всегда включать вызов super (). Если вы решили это сделать, это будет потому, что вы хотите напомнить читателю, что объекты базового класса должны быть созданы как часть объекта подкласса, и вы хотите сделать конкретный конструктор суперкласса явным. Традиционно всегда включенный вызов super () довольно странный, поскольку традиционно код выводится только в том случае, если он отличается от поведения по умолчанию.

7
задан Bdebeez 2 November 2009 в 02:42
поделиться

2 ответа

У меня есть два приложения в магазине приложений, которые смешивают эти две платформы. AVAudioPlayer для звуков, требующих включения и выключения, а также регулировки громкости, а также панель инструментов AudioServices для коротких звуковых сигналов и щелчков. Единственное, что я могу придумать, это то, что громкость AVAudioPlayer, кажется, регулируется отдельно от звуков AudioServices. Поэтому убедитесь, что в тестере не отключены звуки (с помощью переключателя режима вибрации) или громкость не уменьшена.

Если это не помогает, расскажите мне больше о ваших звуках / коде, и я смогу добавьте код в мое приложение, чтобы увидеть, смогу ли я добиться такого же поведения. Конечно, похоже, что у большинства ваших тестеров этой проблемы нет, и я, вероятно, ее тоже не увижу.

8
ответ дан 6 December 2019 в 11:49
поделиться

РЕДАКТИРОВАТЬ 2 :
Я определил причину ошибки. Две разные аудиофреймы воспроизводятся с двумя разными настройками громкости. Есть основная громкость (это то, что появляется, когда вы находитесь в приложении, и не имеет названия) и громкость звонка (это то, что отображается, когда вы находитесь на главном экране без загруженного приложения). AVAudioPlayer вызывает воспроизведение с основной настройкой громкости. Поскольку я установил категорию AVAudioSessionCategorySoloAmbient (см. Код ниже), это регулятор громкости, который будет регулироваться, если вы используете качельку громкости внутри приложения. Системные звуки, однако, воспроизводятся на уровне громкости звонка. Это НЕ появится внутри приложения и, как таковое, не позволяет пользователю изменять свои настройки во время игры.

Легко увидеть возможную путаницу для пользователя: допустим, у него установлен низкий уровень звонка, или даже выкл. Они начинают играть в игру. Они слышат музыку на титульном экране (AVAudioPlayer), могут увеличивать или уменьшать громкость, и он нормально реагирует. Затем они запускают игру и воспроизводятся звуковые эффекты (SystemSounds), но они ничего не слышат, потому что громкость звонка низкая / выключена. Чтобы услышать звуковые эффекты, они увеличивают громкость, и фоновая музыка реагирует соответствующим образом. Итак, с этой точки зрения, определенно похоже, что звуковые эффекты просто не воспроизводятся.

Если у вас возникла подобная ситуация, попросите пользователя убедиться, что громкость его звонка увеличена, прежде чем играть в игру, а его переключатель отключения звука включен (то есть не отключен). Вы также можете проверить все это, выполнив тест самостоятельно - уменьшите громкость звонка и увеличьте громкость в приложении. Ваш SystemSound должен исчезнуть.

Оригинальный ответ : Они начинают играть в игру. Они слышат музыку на титульном экране (AVAudioPlayer), могут увеличивать или уменьшать громкость, и он нормально реагирует. Затем они запускают игру и воспроизводятся звуковые эффекты (SystemSounds), но они ничего не слышат, потому что громкость звонка низкая / выключена. Чтобы услышать звуковые эффекты, они увеличивают громкость, и фоновая музыка реагирует соответствующим образом. Итак, с этой точки зрения, определенно похоже, что звуковые эффекты просто не воспроизводятся.

Если у вас возникла подобная ситуация, попросите пользователя убедиться, что громкость его звонка увеличена, прежде чем играть в игру, а его переключатель отключения звука включен (то есть не отключен). Вы также можете проверить все это, выполнив тест самостоятельно - уменьшите громкость звонка и увеличьте громкость в приложении. Ваш SystemSound должен исчезнуть.

Оригинальный ответ : Они начинают играть в игру. Они слышат музыку на титульном экране (AVAudioPlayer), могут увеличивать или уменьшать громкость, и он нормально реагирует. Затем они запускают игру и воспроизводятся звуковые эффекты (SystemSounds), но они ничего не слышат, потому что громкость звонка низкая / выключена. Чтобы услышать звуковые эффекты, они увеличивают громкость, и фоновая музыка реагирует соответствующим образом. Итак, с этой точки зрения, определенно похоже, что звуковые эффекты просто не воспроизводятся.

Если у вас возникла подобная ситуация, попросите пользователя убедиться, что громкость его звонка увеличена, прежде чем играть в игру, а его переключатель отключения звука включен (то есть не отключен). Вы также можете проверить все это, выполнив тест самостоятельно - уменьшите громкость звонка и увеличьте громкость в приложении. Ваш SystemSound должен исчезнуть.

Оригинальный ответ : Перерывая все документы заново, я нашел ответ. Я неправильно активировал аудиосеанс. Раньше у меня был только этот код для установки категории:

NSError *setCategoryError = nil; 
BOOL    categoryWasSet    = [[AVAudioSession sharedInstance] 
                              setCategory: AVAudioSessionCategorySoloAmbient 
                              error: &setCategoryError]; 

Но мне также нужно было добавить следующий код для явной активации аудиосеанса:

NSError *activationError  = nil;
BOOL    activationSuccess = [[AVAudioSession sharedInstance]
                              setActive: YES 
                              error: &activationError];

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

РЕДАКТИРОВАТЬ: Это, похоже, не решило проблему в конце концов. Я получил ложное срабатывание тестера, и при более подробном рассмотрении кажется, что он на самом деле не слышал звуки, генерируемые SystemSound.

9
ответ дан 6 December 2019 в 11:49
поделиться