Запись звука в OSS (Linux)
От: sang150189  
Дата: 02.06.12 08:47
Оценка:
Здравствуйте!

Я пытаюсь реализовать запись звука посредством 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 audio linux c
Re: Запись звука в OSS (Linux)
От: nen777w  
Дата: 02.06.12 14:08
Оценка:
Никогда не слышал о OSS, но попробую посоветовать.

S>Прблема в том, что когда я пытаюсь использоват 16-битный формат (AFMT_S16_LE/AFMT_S16_NE/AFMT_S16_BE), звук записывается некорректно — фрагменты аудио пропадают/пропускаются. Но если поставить 8-битный формат (AFMT_U8), то всё работает без проблем — записывается отлично.


Попробую предположить что данные не пропадают а скорее всего вы перезаписываете новые поверх старых т.е. что то не так с вычислением значением offset.
Как вариант, посмотрите библиотеку portaudio думаю там есть и это.
Re: Запись звука в OSS (Linux)
От: sd_  
Дата: 19.06.12 13:10
Оценка:
Здравствуйте, 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 все понятно и доступно.
Re: Запись звука в OSS (Linux)
От: Аноним  
Дата: 19.06.12 13:25
Оценка:
a нафига OSS если уже давно в Линуксе он не используется ? Ему на смену пришла ALSA.
а так есть много библиотек — libaudio , OpenAL, libao, portaudio
Re: Запись звука в OSS (Linux)
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 20.06.12 15:09
Оценка:
Здравствуйте, 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. Просто и надёжно.
Sic luceat lux!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.