Здравствуйте!
Я пытаюсь реализовать запись звука посредством OSS под линуксом. вот моя простая тестовая программа :
http://pastebin.com/mhSYhYMr
Прблема в том, что когда я пытаюсь использоват 16-битный формат (AFMT_S16_LE/AFMT_S16_NE/AFMT_S16_BE), звук записывается некорректно — фрагменты аудио пропадают/пропускаются. Но если поставить 8-битный формат (AFMT_U8), то всё работает без проблем — записывается отлично.
Я проверял эту тестовую программу на Ubuntu Linux 11.10 :
g++ main.c
padsp ./a.out
Я пробовал разные пути решения проблемы — использование select() для определения доступности данных для чтения, изменение частты сэмплирования, использование SNDCTL_DSP_GETISPACE для определения сколько данных доступно для чтения, использование SNDCTL_DSP_GETBLKSIZE для чтения рекомендованного размера фрагмента, но ничего из этого не помогло.
Я заметил что read() часто возвращает меньше данных, чем было запрошено, я думаю это также может быть причиной проблемы.
Кто-нибудь может что-нибудь сказать по поводу этой проблемы, или указать что неверно в моём коде, или предоставить работающий OSS код? В интернете что-то с этим совсем туго.
Никогда не слышал о OSS, но попробую посоветовать.
S>Прблема в том, что когда я пытаюсь использоват 16-битный формат (AFMT_S16_LE/AFMT_S16_NE/AFMT_S16_BE), звук записывается некорректно — фрагменты аудио пропадают/пропускаются. Но если поставить 8-битный формат (AFMT_U8), то всё работает без проблем — записывается отлично.
Попробую предположить что данные не пропадают а скорее всего вы перезаписываете новые поверх старых т.е. что то не так с вычислением значением offset.
Как вариант, посмотрите библиотеку
portaudio думаю там есть и это.
Здравствуйте, sang150189, Вы писали:
S>Здравствуйте!
S>Я пытаюсь реализовать запись звука посредством OSS под линуксом. вот моя простая тестовая программа :
S>http://pastebin.com/mhSYhYMr
S>Прблема в том, что когда я пытаюсь использоват 16-битный формат (AFMT_S16_LE/AFMT_S16_NE/AFMT_S16_BE), звук записывается некорректно — фрагменты аудио пропадают/пропускаются. Но если поставить 8-битный формат (AFMT_U8), то всё работает без проблем — записывается отлично.
S>Я проверял эту тестовую программу на Ubuntu Linux 11.10 :
S>g++ main.c
S>padsp ./a.out
S>Я пробовал разные пути решения проблемы — использование select() для определения доступности данных для чтения, изменение частты сэмплирования, использование SNDCTL_DSP_GETISPACE для определения сколько данных доступно для чтения, использование SNDCTL_DSP_GETBLKSIZE для чтения рекомендованного размера фрагмента, но ничего из этого не помогло.
S>Я заметил что read() часто возвращает меньше данных, чем было запрошено, я думаю это также может быть причиной проблемы.
S>Кто-нибудь может что-нибудь сказать по поводу этой проблемы, или указать что неверно в моём коде, или предоставить работающий OSS код? В интернете что-то с этим совсем туго.
Во время иницилизации можно изменить размер блока, который будет выделяться. А дальше все как делайте...
Детали см.
http://manuals.opensound.com все понятно и доступно.
a нафига OSS если уже давно в Линуксе он не используется ? Ему на смену пришла ALSA.
а так есть много библиотек — libaudio , OpenAL, libao, portaudio
Здравствуйте, sang150189, Вы писали:
S>Здравствуйте!
S>Я пытаюсь реализовать запись звука посредством OSS под линуксом. вот моя простая тестовая программа :
S>http://pastebin.com/mhSYhYMr
S>Прблема в том, что когда я пытаюсь использоват 16-битный формат (AFMT_S16_LE/AFMT_S16_NE/AFMT_S16_BE), звук записывается некорректно — фрагменты аудио пропадают/пропускаются. Но если поставить 8-битный формат (AFMT_U8), то всё работает без проблем — записывается отлично.
S>Я проверял эту тестовую программу на Ubuntu Linux 11.10 :
S>g++ main.c
S>padsp ./a.out
S>Я пробовал разные пути решения проблемы — использование select() для определения доступности данных для чтения, изменение частты сэмплирования, использование SNDCTL_DSP_GETISPACE для определения сколько данных доступно для чтения, использование SNDCTL_DSP_GETBLKSIZE для чтения рекомендованного размера фрагмента, но ничего из этого не помогло.
S>Я заметил что read() часто возвращает меньше данных, чем было запрошено, я думаю это также может быть причиной проблемы.
S>Кто-нибудь может что-нибудь сказать по поводу этой проблемы, или указать что неверно в моём коде, или предоставить работающий OSS код? В интернете что-то с этим совсем туго.
Возьми богомерзки GStreamer. Просто и надёжно.